2013-07-30 127 views
3

我希望我的AngularJS應用程序發出http請求以從服務器檢索用戶信息或重定向到登錄屏幕。我在我的應用程序主模塊的運行塊中實現了這一點。但是,如何在運行塊中測試代碼?或者我應該將這個初始化代碼放在控制器中以使其可測試?我正在用Karma和Jasmine寫我的測試。如何測試模塊的運行塊

任何幫助,將不勝感激!

回答

12

您可以通過模塊的_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 
+1

謝謝,這有效!但在我的情況下,因爲我定義了我的運行塊像這樣:angular.module('app',[])。run(['dep',function(dep){...}]);我必須使用angular.module('app')._ runBlocks [0] [1] –

+0

來訪問實際的運行塊函數。一個有用的注意事項是,您可以使用'$ injector.invoke'將依賴關係注入到運行塊中。 –

2

你檢出了$ routeProvider resolve屬性嗎?您可以使用resolve屬性檢查用戶的登錄狀態並相應地執行操作。請參閱http://www.youtube.com/watch?v=P6KITGRQujQhttp://docs.angularjs.org/api/ng.$routeProvider#when

在解析對象中,可以包含需要解析的服務和/或工廠的名稱(因此對服務/工廠具有單獨的單元測試),或者邏輯簡單足夠,並且不需要在自己的服務中分解出來,您只需編寫一個新功能

+0

感謝您指出這一點。如果我想要檢查每個路由更改的會話,但是因爲我想只在首次進入我的應用時纔會這樣做,所以我會依賴一個運行塊。 –

8

一種解決方案是在運行的代碼塊移動到服務:

angular.module('app', []) 
    .run(function(runBlockService) { 
    runBlockService.run(); 
    }); 

併爲該服務編寫單元測試。