gpt4 book ai didi

javascript - 我什么时候应该在我的 Angular JS 单元测试中使用 $provide 与 Jasmine Spies

转载 作者:可可西里 更新时间:2023-11-01 02:42:29 24 4
gpt4 key购买 nike

我在一个大型 Angular 应用程序上工作,最初我们通过使用 $provide 来模拟服务来完成大量测试。然而,我们现在在我们的测试中有很多 Jasmine Spies,以便对服务进行 stub 和监视。

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

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

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

spyOn(jq.prototype, 'on');

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

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

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

如有任何见解或帮助,我们将不胜感激。

最佳答案

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

  • 测试代码更简单/更清晰/更短
  • 限制关于您的测试代码在内部执行的操作的假设。
  • 减少它的副作用(比如运行实际的 Ajax 请求)
  • 使测试在术语或运行时间方面尽可能短。

通常 spyOn 方法适用于,为了执行上述操作,我想 stub 来自服务/工厂的单个方法。如果我需要模拟整个服务/工厂,请使用 $provide

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

  • 如果您正在测试一项服务,然后要对该服务的其他方法进行 stub ,则必须使用 spyOn

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

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

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

    用作:

    myFactory(option);

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

    <

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

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

然后在适当的时候进行测试:

expect(myFactorySpy).toHaveBeenCalledWith(option);

关于javascript - 我什么时候应该在我的 Angular JS 单元测试中使用 $provide 与 Jasmine Spies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22946821/

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