AngularJS茉莉花服务模拟

时间:2015-05-28 15:10:14

标签: javascript angularjs unit-testing jasmine

使用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()

的情况下,为什么存根效果不同的任何想法

1 个答案:

答案 0 :(得分:0)

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

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

您何时应该使用其中一个?

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

在处理服务/工厂或路由测试时,我主要使用$provide方法。由于服务不能被新建和#34;和控制器一样,我们需要欺骗注入函数来使用我们的假货。

在测试路由的情况下,我们没有其他可能性,除了使用提供程序来存根路由解析器中使用的服务。

在存在verifyNoOutstandingExpectation()

的情况下,为什么存根效果不同的任何想法

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