在javascript闭包中进行测试
Testing within a javascript closure
是否可以对存在于闭包中的javascript函数进行单元测试,例如,给定以下内容:
(function() {
var a = function() {
//do something
}
window.b = function() {
// do something else
}
})();
是否有可能对函数a进行单元测试而不暴露它?如果没有,是否有一个好方法来暴露a,但只在测试模式下?
你的匿名函数可以接受一个在非测试模式下未定义的参数,并说这个参数将是一个对象,你可以用a
填充对象而不直接暴露a
。
Just my .02$
这里最大的问题是为什么要隐藏它?事实上,你有这个函数a你想要测试,这表明a有它自己的责任应该被测试。当与暴露它的最小风险进行权衡时,将其取出并进行测试将获得更大的价值。如果您真的想要隐藏它,那么我建议您使用类似Manux的方法,创建一个对象来完成a的功能,但不直接暴露a。然后,您可以通过测试对象来测试a的行为。
四年过去了,我现在有了一个更好的解决方案。
生成代码的可测试版本作为构建步骤。
假设我正在使用Gulp来缩小我的JavaScript,我的代码看起来像这样:
var a = function() {}
window.b = function() {}
不是缺少闭包。现在我设置一个gulp任务,让它监视我的代码,如下所示:
gulp.task('js', function () {
return gulp.src([dirs.js.src, '*.js'].join('/'))
.pipe(wrap('(function() {'n<%= contents %>'n})();'))
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(gulp.dest(dirs.js.dest));
});
这将把我的代码包装在IIFE中,产生以下输出:
(function() {
var a = function() {}
window.b = function() {}
)();
生成可测试版本
现在我添加另一个Gulp任务,像这样
gulp.task('testJs', function () {
return gulp.src([dirs.test.src, '*.js'].join('/'))
.pipe(wrap(
[
'(function() {',
'<%= contents %>',
'// Smuggle locals out of closure for testing',
'window.a = a;',
'})();'
].join(''n')
))
.pipe(concat(package.name + '.testable.js'))
.pipe(gulp.dest(dirs.test.dest));
});
这会在我的test目录下生成以下不安全但可测试的代码:
(function() {
var a = function() {}
window.b = function() {}
// Smuggle locals out of closure for testing
window.a = a;
)();
Add a watch task…
gulp.task('watch', function() {
gulp.watch([dirs.js.src, '**', '*.js'].join('/'), ['js', 'testJs']);
});
…你就完成了。
看到
请看这里的例子:
https://github.com/forwardadvance/ng-tweets相关文章:
- 用于测试javascript中异步加载的脚本的工具
- 是否可以测试javascript函数是否是构造函数
- 使用jasmine测试JavaScript回调函数
- 测试 JavaScript Zombie 事件处理程序或 DOM 元素
- 测试JavaScript是否符合异常变量名
- 使用 Capybara 和 Minitest 来测试 JavaScript
- 在CakePHP中测试JavaScript
- Eclipse和Tomcat中的网站开发和测试:javascript被缓存
- 如何使用moment.js测试javascript对象是否为Date
- 在Rails中准确测试JavaScript分析交付系统
- 如何在经过身份验证的页面上测试javascript隐藏/显示行为
- 在 Rails 中测试 JavaScript 视图
- 使用 nodeunit 测试 JavaScript 库 - FileApi, substr undefined
- 如何加载测试 JavaScript/AngularJS 应用程序
- 用Selenium测试javascript生成的html
- 如何测试 javascript 方法是否创建一个对象并调用该对象上的方法
- 测试Javascript框架
- 在浏览器中测试 JavaScript 脚本,而无需创建 html/javascript 测试文件
- 使用 Mocha 测试 JavaScript - 如何使用 console.log 来调试测试
- 如何对 Web 套接字进行单元测试 - JavaScript