Javascript 显示模块模式-使用Jasmine进行单元测试
在与暴露的模块模式短暂浪漫之后,我逐渐意识到在单元测试模块方面存在倒退。然而,我无法决定这是我测试模块的方法,还是存在某种形式的变通方法 考虑以下代码:Javascript 显示模块模式-使用Jasmine进行单元测试,javascript,jasmine,Javascript,Jasmine,在与暴露的模块模式短暂浪漫之后,我逐渐意识到在单元测试模块方面存在倒退。然而,我无法决定这是我测试模块的方法,还是存在某种形式的变通方法 考虑以下代码: var myWonderfulModule = (function () { function publicMethodA (condition) { if(condition === 'b') { publicMethodB(); } } function 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这样的东西,或者恢复到非模块化代码
任何建议,谢谢 你不能测试闭包的内部方法。你也不应该监视它。把你的模块想象成一个黑匣子。你把东西放进去,然后把东西拿出来。所有你应该测试的是,你从你的模块中得到的东西就是你所期望的 监视模块中的方法没有多大意义。想想看。如果你监视它,测试就会通过。现在您更改了功能,使其创建了一个bug,测试仍然通过,因为函数仍然被调用,但您从未提及该bug。如果你只是测试出现的东西,你不需要监视内部方法,因为当模块的结果是你所期望的时,调用它们是隐式的 所以在你的情况下,没有东西进去,也没有东西出来。这没有多大意义,但我相信您的模块与DOM交互或进行ajax调用。这是您可以测试(DOM)或应该监视(ajax)的东西 你也应该让自己熟悉。这些模式将使您的模块更易于测试 如果在从publicMethodA()调用publicMethodB()时使用关键字“this”,它将起作用。例如:
var myWonderfulModule = (function () {
function publicMethodA (condition) {
if(condition === 'b') {
this.publicMethodB();
}
}
function publicMethodB () {
// ...
}
return {
methodA : publicMethodA,
methodB : publicMethodB
}
}());