在短暂地尝试了透明模块模式后,我发现在测试模块时存在一些问题。然而我无法确定这是我的测试方法的问题还是有某种解决方法。
请考虑以下代码:
如果我想要测试(使用Jasmine)通过publicMethodA到达publicMethodB的各种路径,我可以编写一个小测试如下所示:
请考虑以下代码:
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的东西或恢复回非模块化代码。
任何建议都将不胜感激!