【问题标题】:When should I use $provide versus Jasmine Spies in my Angular JS Unit tests我什么时候应该在我的 Angular JS 单元测试中使用 $provide 和 Jasmine Spies
【发布时间】:2014-05-21 17:26:35
【问题描述】:

我在一个大型 Angular 应用程序上工作,最初我们通过使用 $provide 模拟服务完成了很多测试。但是,我们现在在测试中使用了很多 Jasmine Spies,以便对服务进行存根和监视。

spyOn(myService, 'myMethod').andReturn 'myValue'

我们真的应该为此使用 $provide,还是在某些情况下监视服务是最好的方法?

在 Angular 测试中,他们使用 spying on Jquery 的间谍,我将其视为外部服务。

spyOn(jq.prototype, 'on');

$provide似乎更多用于内部服务。

  module(function($provide){
    $provide.provider('$exceptionHandler', $ExceptionHandlerProvider);
  });

还有一个 Jasmine createSpy 函数,但现在我认为 $provide 应该始终优先于它。

对此的任何见解或帮助将不胜感激。

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine


    【解决方案1】:

    根据我自己的(有限的)经验,我会说做任何方法:

    • 测试代码更简单/更清晰/更短
    • 限制对您的测试在内部执行的代码的假设。
    • 减少其副作用(例如运行实际的 Ajax 请求)
    • 尽可能缩短测试时间,无论是在条款还是运行时间方面。

    通常spyOn 方法会起作用,为了完成上述操作,我想从服务/工厂中存根单个方法。如果我需要模拟整个服务/工厂,请使用$provide

    想到了一些需要其中之一的特定情况:

    • 如果您正在测试服务,然后要从该服务中存根其他方法,则必须使用 spyOn

    • 为了确保稍后不会在被测代码中引入额外的依赖项,$provide 增加了更多保护。说,如果你想确保ServiceA 只需要ServiceB 中的myMethod,那么$provide 我认为是要走的路,好像ServiceA 在测试期间从ServiceB 调用任何未定义的方法, 会引发错误。

      $provide.provider('ServiceB', {
          myMethod: function() {}
      });
      
    • 如果你想模拟一个返回函数的工厂,那么:

      app.factory('myFactory', function() {
        return function(option) {
          // Do something here
        }
      });
      

      用作:

      myFactory(option);
      

      然后验证一些代码调用myFactory(option)我认为没有其他选择然后使用$provide模拟工厂。

    顺便说一句,它们不是相互排斥的选项。您可以使用$provide,然后仍然有间谍参与。在前面的示例中,如果您想验证工厂是否使用选项调用,您可能必须:

    var myFactorySpy = jasmine.createSpy();
    $provide.provider('myFactory', myFactorySpy);
    

    然后在适当的点进行测试:

    expect(myFactorySpy).toHaveBeenCalledWith(option);
    

    【讨论】:

    • 这从另一个角度很有帮助,谢谢。关于模拟返回函数的工厂 - 我认为您也可以使用 createSpy 来返回函数。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2011-05-14
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多