【问题标题】:Revealing Module Pattern - Unit Testing with Jasmine揭示模块模式 - 使用 Jasmine 进行单元测试
【发布时间】: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


    【解决方案1】:

    你不能测试闭包的实习生方法。你也不应该监视它。把你的模块想象成一个黑盒子。你把东西放进去,你就会拿出东西。你应该测试的是你从你的模块中得到的东西是你所期望的。

    监视模块中的方法没有多大意义。想想看。你监视它,测试通过。现在您更改了功能,因此它创建了一个错误,测试仍然通过,因为该函数仍然被调用,但您从未提及该错误。如果你只是测试出来的东西,你不需要监视内部方法,因为当模块的结果是你所期望的时,它们被调用是隐含的。

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

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

    【讨论】:

      【解决方案2】:

      如果在从 publicMethodA() 调用 publicMethodB() 时使用关键字“this”,它将起作用。例如:

      var myWonderfulModule = (function () {
          function publicMethodA (condition) {
              if(condition === 'b') {
                  this.publicMethodB();
              }
          }
      
          function publicMethodB () {
              // ...
          }
      
          return {
              methodA : publicMethodA,
              methodB : publicMethodB
          }
      }());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        相关资源
        最近更新 更多