2013-10-08 107 views
3

我對AngularJS相當陌生,並且正在努力學習一些最佳實踐。我有事情的工作,但想開始添加一些單元測試到我的模塊和控制器。我期待解決的第一個問題是我的AuthModule。angularJS單元測試哪裏運行包含HTTP請求?

我有一個AuthModule。該模塊註冊一個名爲「AuthModule」的工廠,並公開諸如「setAuthenticatedUser」之類的東西,以及諸如「isLoggedIn」和「currentUser」之類的字段。我認爲這是AngularJS應用程序中相當常見的模式,在具體的實現細節上有一些變化。

authModule.factory( 'AuthModule', 功能(APIService,$ rootScope){

var _currentUser = null; 
    var _isLoggedIn = false; 

    return { 
    'setAuthenticatedUser' : function(currentUser) { 

     _currentUser = currentUser; 
     _isLoggedIn = currentUser == null ? false : true; 

     $rootScope.$broadcast('event:authenticatedUserChanged', 
      _currentUser); 

     if (_isLoggedIn == false) { 
     $rootScope.$broadcast('event:loginRequired') 
     } 

     $rootScope.authenticatedUser = _currentUser; 
     $rootScope.isLoggedIn = _isLoggedIn; 

    }, 
    'isLoggedIn' : _isLoggedIn, 
    'currentUser' : _currentUser 
    } 
}); 

模塊做了一些其他的東西像註冊一個事件的處理 「loginRequired」 的人發回主屏幕,這些事件是由AuthModule工廠提高。

authModule.run(function($rootScope, $log, $location) { 
    $rootScope.$on("event:loginRequired", function(event, data) { 
    $log.info("sending him home. Login is required"); 
    $location.path("/"); 
    }); 
}); 

最後,該模塊具有將使用API​​服務,我要確定登錄用戶當前表單後面跑塊結束。

authModule.run(
    function(APIService, $log, AuthModule) { 
     APIService.keepAlive().then(function(currentUser) { 
     AuthModule.setAuthenticatedUser(currentUser.user); 
     }, function(response) { 
     AuthModule.setAuthenticatedUser(null); 
     }); 
    }); 

下面是我的一些問題:

我的問題是這個你會如何設置測試?我會認爲我需要模擬APIService?我很難過,因爲我不斷收到意外的POST請求給我的/ keepalive函數(在APIService.keepAlive()中調用)?

有什麼辦法可以使用$ httpBackend來返回正確的響應給實際的KeepAlive調用嗎?這將阻止我不得不模擬API服務?

我是否應該將獲取當前登錄用戶的.run()塊拉出AuthModule並將其放入主應用程序中?看起來無論我把run()塊放在哪裏,我似乎都無法在加載模塊之前初始化$ httpbackend?

AuthModule應該是自己的模塊嗎?還是應該使用主應用程序模塊並在那裏註冊工廠?

回答

2

對於主要方法,運行塊是Angular中最接近的東西。運行塊是需要運行以啓動應用程序的代碼。在完成所有服務配置並創建噴油器後執行。運行塊通常包含很難進行單元測試的代碼,因此應該在隔離模塊中聲明,以便在單元測試中可以忽略它們。 angularjs docs

我建議你看看這個authentication service,使用服務是要走的路。

希望這會有所幫助...祝你好運