[英]How can I mock an http call executed in module.run Angular app?
我試圖運行以下代碼(其中fusseApp是一個angularModule):
fusseApp.run(function(URI, $http){
$http.get('/check/userLogged').then(function(response){
console.log(response);
});
PS:實際上我的http呼叫是在工廠執行的,在這里我們只是打電話給這家工廠
angularModule被模擬:
angular.module('fusseApp.mainMocks', ['fusseApp', 'fusseApp.loginMocks', 'ngMockE2E', 'ngResource'])
.run(function($httpBackend, $http) {
...
$httpBackend.whenGET('/check/userLogged').respond(200,response);
我的問題是fusseApp.run在mock模塊初始化之前執行。 所以我有一個錯誤:
未捕獲錯誤:意外請求:GET / check / userLogged不再需要預期請求
這個問題似乎已經在茉莉花單元測試中提出,但我找不到解決方案。 在事件告訴我應用程序何時完全初始化后,是否可以運行我的$http
調用?
我需要在屏幕上顯示任何數據之前檢查用戶是否已通過身份驗證。
也許這可以幫助......
.run()
總是被執行,如果你在代碼中設置ng-app=""
,它是boostrap進程的一部分,從那里就不能停止編譯和鏈接過程,但有很多方法可以防止如果用戶未登錄則從呈現視圖:
A)手動角度boostraping(不是那么有趣但可行)可以在認證完成后完成,使用jQuery $ .ajax或其他lib,因為$ http服務在NG外面的圖片外。
B)但是在.run()
你可以訪問$rootScope
和所有NG服務,因此你可以監聽$stateChangeStart
並在監聽器內執行auth驗證。
這或多或少是NG身份驗證的最佳實踐,每次用戶更改狀態時,此偵聽器都會繼續檢查(這樣可以捕獲會話到期),在我的代碼中(我在各種項目中使用它)我這樣做:
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
if (!AuthService.isAuthenticated()) {
$state.transitionTo("login"); // redirect to login page
event.preventDefault();
}
});
AuthService
只是一個簡單的服務,如果用戶通過身份驗證,則返回true
或false
。 根據我的經驗,隱藏未授權用戶的視圖和重定向的最佳解決方案是捕獲狀態更改過程,就像我之前顯示的那樣。 因為你可以裝飾狀態,所以可以在toState
參數中訪問這些屬性(至少在ui-router中)所以可以做各種奇特的事情,比如捕獲用戶角色等等......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.