2017-03-22 95 views
1

儘管在嘲笑Karma中的單個Angular服務時存在很多問題,但我在整個測試應用程序時使我的模擬更無處不在。選擇性模擬服務與Karma進行角度測試

在我當前的設置中,我有一個名爲serviceMocks的模塊,其中包含一個工廠,其中包含應用程序中每個服務的模擬。

人爲的例子:

angular.module('serviceMocks',['ngMock']) 
    .factory('myServiceOne', function() {...}) 
    .factory('myServiceTwo', function($httpBackend,$q) {...}) 

該測試可以使用一個或多個服務的依賴控制器和指令時的偉大工程。我將我的應用程序模塊和serviceMocks模塊包含在我的測試文件中,並且每個服務都被正確替換。

beforeEach(module('myApp')); 
beforeEach(module('serviceMocks')); 

it('properly substitutes mocks throughout my tests', function() {...}); 

然而,測試服務本身時,無法包括serviceMocks模塊,因爲服務我測試是由它的模擬使測試無用取代。但是,我仍然希望所有其他服務被嘲笑作爲服務可能取決於一個或多個服務的執行。

我認爲這樣做的一種方式是使我的服務在全球範圍內可用,也許通過附加一個對象來持有嘲笑window。像這樣在測試時的服務,我可以再單獨包括嘲笑:

beforeEach(module('myApp', function($provide) { 
    $provide.value('myServiceOne',window.mocks.myServiceOneMock); 
    $provide.value('myServiceTwo',window.mocks.myServiceTwoMock); 
}); 

但是這種方法沒有奏效,因爲有些嘲笑的使用$q或其他角度的服務才能正常工作,而這些服務沒有正確注射時只需將工廠對象附加到窗口即可。

我正在尋找一種方法來測試服務,同時讓一個位置爲所有服務定義模擬。可能性我想,但一直無法與成功:

  • A)有myApp的模塊 配置階段之前的serviceMocks模塊的.RUN()塊運行。 (在這種情況下,我可以附加 每個服務窗口來作爲角度的依賴關係將是 適當注入,注入各如上所示)
  • B)能夠覆蓋我正在與測試服務其實際在每個服務的測試文件中實現
  • C)否則能夠定義和全局訪問這些模擬,同時仍然確保每個模擬可以訪問某些角度服務,如$q

回答

1

該問題包含答案的線索。如果serviceMocks模塊導致設計問題,則使用它是一個錯誤。

正確的模式是每個單元有一個模塊(在這種情況下是模擬服務)。 ngMock不是需要,它會在Jasmine測試中自動加載。這些模塊可以通過一個使用一個:

beforeEach(module('app', 'serviceOneMock', 'serviceTwoMock')); 

或結合在一起:

angular.module('serviceMocks', ['serviceOneMock', 'serviceTwoMock']) 

有沒有當serviceMocks模塊應該存在這麼多的情況下。只是因爲決定哪些服務應該被嘲笑,哪些不應該爲每個describe區塊制定。

大多數時間嘲笑的服務都是針對當前規範個體或取決於局部變量。在這種情況下,服務是嘲笑就地:

var promiseResult; 

beforeEach(module('app')); 
beforeEach(module({ foo: 'instead of $provide.value(...)' }); 
beforeEach(($provide) => { 
    $provide.factory('bar', ($q) => { 
    return $q.resolve(promiseResult); 
    } 
}); 
... 

專用serviceOneMock這樣做,等模塊可能需要嘲笑服務進行重構,任何時候,可以很明顯他們是太普通了,不適合的情況下好。

如果模擬服務在WET測試中的行爲和結果略有不同時使用了不止一次,那麼最好製作一個幫助函數,根據當前的規範生成它,而不是將其硬編碼到serviceOneMock等。模塊。

相關問題