我對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應該是自己的模塊嗎?還是應該使用主應用程序模塊並在那裏註冊工廠?