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
    }
}());