2015-05-28 60 views
4

在使用Jasmine测试Angular控制器时,似乎有几种方法可以将服务剔除。AngularJS茉莉花服务模拟

有一个问题我已经习惯了的方式就是做一个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()

+0

您能向我们展示MyRealService和您正在测试的控制器的内部实现吗? –

+0

你还在做:beforeEach(module('app'));在您的其他情况下注入()之前? – patrick

回答

0

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

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

什么时候应该使用一个?

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

我在处理服务/工厂或路由测试时主要使用$provide方法。由于服务不能像控制器那样“新兴”,我们需要欺骗注入功能来使用我们的提供商的假货。

而在测试路由的情况下,除了使用提供者来存储路由解析器中使用的服务外,没有其他可能。

任何想法,为什么磕碰的作用是在verifyNoOutstandingExpectation()

不是真的就如何回答这个问题肯定存在不同,但我发现$httpBackend是不那么明显使用。特别是在测试路线时。它记录了所有流量,包括诸如呼叫路由中定义的模板等,这使得在设置中忽略呼叫变得非常容易。