5

こんにちは、私は を使用してアプリを構築しAngularJSています。今は、アプリケーションの単体テストを行っています。サービス、コントローラーなどの単体テスト ケースの書き方は知っていますが、$routeChangeStart.

app.js に次のコードがあります

app.run(function ($rootScope, $location, AuthenticationService) {
    $rootScope.$on('$routeChangeStart', function () {
        if (AuthenticationService.isLoggedIn()) {
            $rootScope.Authenticated = 'true';
            $rootScope.Identity = localStorage.getItem('identification_id');
        } else {
            $rootScope.Authenticated = 'false';
            $rootScope.Identity = localStorage.removeItem('identification_id');
        }
    });
});

アプリのルーティングごとにユーザーがログインしているかどうかを確認するために、このコードを作成しました。AuthenticationServiceこの目的のために、次のようなサービスを作成しました。

app.factory('AuthenticationService', function (SessionService) {
    return {
        isLoggedIn: function () {
            return SessionService.get('session_id');
        }
    };
});

そして、私のセッションサービスは次のようになります。

app.factory('SessionService', function () {
    return {
        get: function (key) {
            return localStorage.getItem(key);
        }
    };
});

Jasmineテストケースを書くために使用し、Istanbulコードカバレッジに使用しています。を使用してテストを実行するGruntと、app.js で次のようなものが得られます。

ここに画像の説明を入力

これは、この特定のコードのテスト ケースの書き方がわからないため、テスト ケースでこれらのステートメントをカバーしていないためです。助言がありますか?

4

2 に答える 2

8

このrunブロックは、モジュールがロードされるたびに実行されるため、テスト中にリスナーが登録されます。イベント内のコードをテストできるように、そのイベントを実際に送信する必要があるだけです。このような何かがうまくいくはずです:

it("should test the $routeChangeStart listener", inject(function($rootScope) {
   $rootScope.$broadcast("$routeChangeStart");
   //expects for the listener
}));

angularでイベントをテストするにはどうすればよいですか? を参照してください。一般的なイベントのテスト方法について。

于 2013-09-30T21:34:13.740 に答える