使用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()
答案 0 :(得分:0)
两种风格之间的主要区别是什么?
在第一种情况下,我们将假对象自己注入控制器,而使用第二种方法,我们告诉Angular它可以在以后需要注入时找到假货。
您何时应该使用其中一个?
我更喜欢第一种方法,因为它更明显,特别是当我们测试控制器时,它就足够了。
在处理服务/工厂或路由测试时,我主要使用$provide
方法。由于服务不能被新建和#34;和控制器一样,我们需要欺骗注入函数来使用我们的假货。
在测试路由的情况下,我们没有其他可能性,除了使用提供程序来存根路由解析器中使用的服务。
在存在verifyNoOutstandingExpectation()
的情况下,为什么存根效果不同的任何想法不确定如何回答这个问题,但我发现$httpBackend
使用起来并不那么明显。特别是在测试路线时。它记录所有流量,包括调用路由中定义的模板等内容,这样可以很容易地忽略设置中的呼叫。