gpt4 book ai didi

javascript - 揭示模块模式 - 使用 Jasmine 进行单元测试

转载 作者:数据小太阳 更新时间:2023-10-29 03:51:23 27 4
gpt4 key购买 nike

在与揭示性模块模式短暂接触后,我开始意识到单元测试模块的挫折。但是,我无法确定这是否是我测试模块的方法,或者是否有某种形式的解决方法。

考虑以下代码:

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 之类的东西或恢复到非模块化代码。

感谢任何建议!

最佳答案

您不能测试闭包的实习生方法。而且你也不应该监视它。将您的模块想象成一个黑盒子。你把东西放进去,你就会得到东西。您应该测试的只是您从模块中得到的东西是否符合您的预期。

监视模块中的方法没有多大意义。想想看。你监视它,测试通过。现在你改变了功能,所以它产生了一个错误,测试仍然通过,因为函数仍然被调用,但你从未提及错误。如果您只是测试出现的结果,则无需监视内部方法,因为当模块的结果符合您的预期时,调用它们是隐含的。

所以在你的情况下,没有任何东西进入,也没有任何东西出来。这没有多大意义,但我相信您的模块与 DOM 交互或进行 ajax 调用。这些是您可以测试 (DOM) 或您应该监视 (ajax) 的东西。

您还应该让自己熟悉Inversion of Control and Dependency Injection .这些模式将使您的模块更容易测试。

关于javascript - 揭示模块模式 - 使用 Jasmine 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17110304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com