swa*_*ohn 17 javascript unit-testing
我在Javascript中使用模块模式将我的公共接口与私有实现分开.为了简化我正在做的事情,我的代码生成了一个图表.该图表由多个部分(轴,标签,图,图例等)组成.我的代码如下所示:
var Graph = function() {
var private_data;
function draw_legend() { ... }
function draw_plot() { ... }
function helper_func() { ... }
...
return {
add_data: function(data) {
private_data = data;
},
draw: function() {
draw_legend()
draw_plot()
}
}
}
Run Code Online (Sandbox Code Playgroud)
有些人主张只测试你的类的公共接口,这是有道理的,但我真的想进行一些测试来分别测试每个组件.如果我搞砸了我的draw_legend()函数,我希望测试失败,而不是公共draw()函数的测试.我在这里走错了路吗?
我可以将不同类中的每个组件分开,例如创建一个Legend类.但是,为有时只有5到10行代码创建一个类似乎很愚蠢,而且它会更加丑陋,因为我需要传递一堆私有状态.而且我无法测试我的助手功能.我还应该这样做吗?我应该吸吮它,只测试公共抽奖()吗?还是有其他解决方案吗?
无法从外部作用域访问内部函数(私有).如果要测试内部函数,可以考虑添加公共方法以仅用于测试目的.如果您正在使用某种构建环境,例如ant,您可以预处理javascript文件以进行生产并删除这些测试函数.
实际上Javascript是面向对象的语言.它不是一个类型化的类型.
我的解决方案只是一点点破解.QUnit示例:
在Qunit测试html的顶部我声明:
var TEST_AVAILABLE = true;
Run Code Online (Sandbox Code Playgroud)
在testable类中,我有一个像这样的片段:
if(TEST_AVAILABLE){
this.test={
hasDraft:hasDraft,
isInterpIdIn:isInterpIdIn,
// other private methods
};
}
Run Code Online (Sandbox Code Playgroud)
在QUnit中你可以验证
test( "hello booth", function() {
var b = new Booth();
ok(b);
ok(b.test);
ok(!b.test.hasDraft());
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6216 次 |
| 最近记录: |