【问题标题】:AngularJS jasmine service mockAngularJS 茉莉花服务模拟
【发布时间】:2015-08-11 04:36:09
【问题描述】:

在使用 Jasmine 测试 Angular 控制器时,似乎有几种方法可以将服务存根。

我已经习惯的一种方法是在 beforeEach 块中执行以下操作:

mockService = {}

inject( $controller) ->
  controller = $controller('MyController', {
    MyRealService: mockService
  })

另一种方法是使用$provide 来存根我的依赖注入服务:

module('app', ($provide) ->
  mockService = {}
  $provide.value('MyService', mockService)
)

当我有:

afterEach ->
  httpBackend.verifyNoOutstandingExpectation()

在我的测试中。只有$provide 方法有效,$controller 样式无效。使用$controller 测试以某种方式达到MyRealService 并包括其所有依赖项,而不是忽略和使用mockService。如果没有verifyNoOutstandingExpectation(),两种方法的行为似乎相同并且测试通过。

这两种风格的主要区别是什么?你应该在什么时候使用一个而不是另一个?为什么存在verifyNoOutstandingExpectation()时存根的效果会有所不同的任何想法

【问题讨论】:

  • 你能告诉我们MyRealService的内部实现和你正在测试的控制器吗?
  • 你是否也在做:beforeEach(module('app'));在您的其他情况下,在您的 inject() 之前?

标签: javascript angularjs unit-testing jasmine


【解决方案1】:

这两种风格的主要区别是什么?

在第一种情况下,我们将自己的假对象注入到控制器中,而在第二种方法中,我们告诉 Angular 在以后需要注入假对象时可以在哪里找到它们。

你应该在什么时候使用一个而不是另一个?

我更喜欢第一种方法,因为它更明显,尤其是当我们测试控制器时,它就足够了。

在处理服务/工厂或路由测试时,我主要使用$provide 方法。由于服务不能像控制器那样“更新”,我们需要通过提供程序来欺骗注入函数来使用我们的伪造品。

在测试路由的情况下,除了使用提供程序来存根路由解析器中使用的服务之外,我们别无选择。

关于为什么存在 verifyNoOutstandingExpectation() 时存根的效果不同的任何想法

不太确定如何回答这个问题,但我发现$httpBackend 使用起来并不那么明显。特别是在测试路线时。它记录所有流量,包括对路由中定义的模板的调用等,这使得在设置中很容易忽略调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多