我使用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()
}
}
}
有些人主张只测试类的公共接口,这是有意义的,但我真的想进行一些测试,以便分别测试每个组件。如果我搞砸了draw_legend()函数,我希望测试失败,而不是对公共draw()函数进行测试。我是不是走错路了?
我可以将每个组件分离到不同的类中,例如创建一个Legend类。但是为有时只有5-10行代码的代码创建一个类似乎很愚蠢,而且它会更难看,因为我需要传入一堆私有状态。我就不能测试我的助手函数了。不管怎样,我应该这样做吗?我是不是应该接受它,只测试公共的draw()?还是有其他的解决方案?
发布于 2009-04-05 19:42:20
无法从外部作用域访问内部函数(私有)。如果您想测试内部函数,可以考虑添加一个仅用于测试目的的公共方法。如果您使用的是某种构建环境,例如ant,则可以对用于生产的javascript文件进行预处理,并删除这些测试函数。
实际上,Javascript是一种面向对象的语言。它只是不是一个统计类型的。
发布于 2013-01-29 16:44:04
我的解决方案就是一点小技巧。QUnit示例:
在Qunit test html的顶部,我声明:
var TEST_AVAILABLE = true;
在testable类中,我有一个这样的片段:
if(TEST_AVAILABLE){
this.test={
hasDraft:hasDraft,
isInterpIdIn:isInterpIdIn,
// other private methods
};
}
在QUnit中,您可以验证
test( "hello booth", function() {
var b = new Booth();
ok(b);
ok(b.test);
ok(!b.test.hasDraft());
});
发布于 2012-10-08 10:46:23
我也有类似的问题。我想出的解决方案不是我喜欢的,但它确实有效,而且我找不到更好的解决方案。
function Graph()
{
this.Test = function _Test(expressionStr) { return eval(expressionStr); }
var private_data;
function draw_legend() { ... }
function draw_plot() { ... }
function helper_func() { ... }
...
}
要测试:
var g = new Graph();
g.Test("helper_func()") == something;
g.Test("private_data") == something2
https://stackoverflow.com/questions/716207
复制相似问题