儘管在嘲笑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
。