3

私は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 は独自のモジュールである必要がありますか? または、メインのアプリケーション モジュールを使用して、そこにファクトリを登録する必要がありますか?

4

1 に答える 1