2015-05-28 78 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是不那麼明顯使用。特別是在測試路線時。它記錄了所有流量,包括諸如呼叫路由中定義的模板等,這使得在設置中忽略呼叫變得非常容易。