私はAngularJSにかなり慣れていないので、いくつかのベストプラクティスを学ぼうとしています. 動作していますが、モジュールとコントローラーにいくつかの単体テストを追加したいと考えています。私が取り組む最初のものは、AuthModule です。
私はAuthModuleを持っています。このモジュールは「AuthModule」と呼ばれるファクトリを登録し、「setAuthenticatedUser」などを公開し、「isLoggedIn」や「currentUser」などのフィールドも公開します。これは AngularJS アプリケーションではかなり一般的なパターンであり、特定の実装の詳細にいくつかのバリエーションがあると思います。
authModule.factory( 'AuthModule', function(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 をモックアウトする必要があると思いますか? /keepalive 関数 (APIService.keepAlive() 内で呼び出される) への予期しない POST 要求を取得し続けるため、苦労していますか?
実際の KeepAlive 呼び出しに正しい応答を返すために $httpBackend を使用する方法はありますか? これにより、API サービスをモックアウトする必要がなくなりますか?
現在ログインしているユーザーを取得する .run() ブロックを AuthModule から取り出してメイン アプリケーションに配置する必要がありますか? run() ブロックをどこに置いても、モジュールをロードする前に $httpbackend を初期化できないようです。
AuthModule は独自のモジュールである必要がありますか? または、メインのアプリケーション モジュールを使用して、そこにファクトリを登録する必要がありますか?