我希望我的AngularJS應用程序發出http請求以從服務器檢索用戶信息或重定向到登錄屏幕。我在我的應用程序主模塊的運行塊中實現了這一點。但是,如何在運行塊中測試代碼?或者我應該將這個初始化代碼放在控制器中以使其可測試?我正在用Karma和Jasmine寫我的測試。如何測試模塊的運行塊
任何幫助,將不勝感激!
我希望我的AngularJS應用程序發出http請求以從服務器檢索用戶信息或重定向到登錄屏幕。我在我的應用程序主模塊的運行塊中實現了這一點。但是,如何在運行塊中測試代碼?或者我應該將這個初始化代碼放在控制器中以使其可測試?我正在用Karma和Jasmine寫我的測試。如何測試模塊的運行塊
任何幫助,將不勝感激!
您可以通過模塊的_runBlocks屬性獲取對運行塊的引用。
與你的模塊代碼的文件:
angular.module('xmpl', []).
run(function() {
// some code here
});
測試套件:
var myModule = angular.module('xmpl'),
runBlock = myModule._runBlocks[0];
// Now can test the runBlock function according to your scenario
你檢出了$ routeProvider resolve屬性嗎?您可以使用resolve屬性檢查用戶的登錄狀態並相應地執行操作。請參閱http://www.youtube.com/watch?v=P6KITGRQujQ和http://docs.angularjs.org/api/ng.$routeProvider#when
在解析對象中,可以包含需要解析的服務和/或工廠的名稱(因此對服務/工廠具有單獨的單元測試),或者邏輯簡單足夠,並且不需要在自己的服務中分解出來,您只需編寫一個新功能
感謝您指出這一點。如果我想要檢查每個路由更改的會話,但是因爲我想只在首次進入我的應用時纔會這樣做,所以我會依賴一個運行塊。 –
一種解決方案是在運行的代碼塊移動到服務:
angular.module('app', [])
.run(function(runBlockService) {
runBlockService.run();
});
併爲該服務編寫單元測試。
謝謝,這有效!但在我的情況下,因爲我定義了我的運行塊像這樣:angular.module('app',[])。run(['dep',function(dep){...}]);我必須使用angular.module('app')._ runBlocks [0] [1] –
來訪問實際的運行塊函數。一個有用的注意事項是,您可以使用'$ injector.invoke'將依賴關係注入到運行塊中。 –