【发布时间】:2013-06-14 14:00:36
【问题描述】:
在与揭示模块模式有过短暂的接触后,我开始意识到在单元测试模块方面遇到了挫折。但是,我无法确定这是我测试模块的方法,还是有某种形式的解决方法。
考虑以下代码:
var myWonderfulModule = (function () {
function publicMethodA (condition) {
if(condition === 'b') {
publicMethodB();
}
}
function publicMethodB () {
// ...
}
return {
methodA : publicMethodA,
methodB : publicMethodB
}
}());
如果我想测试(使用 Jasmine)从 publicMethodA 到 publicMethodB 的各种路径。我可能会像这样写一个小测试:
it("should make a call to publicMethodB when condition is 'b'", function() {
spyOn(myWonderfulModule , 'publicMethodB');
myWonderfulModule.publicMethodA('b');
expect(myWonderfulModule.publicMethodB).toHaveBeenCalled();
});
如果我理解正确,闭包中有一个 publicMethodB 的副本无法更改。即使我之后更改 myWonderfulModule.publicMethodB:
myWonderfulModule.publicMethodB = undefined;
调用 myWonderfulModule.publicMethodA 仍将运行原始版本的 B。
上面的示例当然是简化的,但是我可以想到很多场景,通过方法对条件路径进行单元测试会很方便。
这是对揭示模块模式的限制还是仅仅是对单元测试的滥用?如果不是,我可以使用哪些解决方法?我正在考虑转向 RequireJS 之类的东西或恢复到非模块化代码。
任何建议表示赞赏!
【问题讨论】:
标签: javascript jasmine