そこで、私が書いたAngularJSアプリケーションの単体テストを書き始めました。このアプリケーションはログインページで保護されているため、ユーザー名がログインしていない場合、ログインページ以外のページへのリクエストはログインページをリダイレクトします。このロジックは、アプリケーションの起動時に1回だけ実行する必要があるため、メインモジュールの.run()メソッドから実行されますが、メインモジュールの.run()メソッド内から実行されるコードをテストする方法はありますか?私は次のテストコードを持っています:
describe('Login Controller', function(){
'use strict';
var scope, controller, $httpBackend, $resource, callback;
beforeEach(module('application'));
beforeEach(inject(function($injector, $rootScope, $controller, $http, $location, authentication, session) {
$httpBackend = $injector.get('$httpBackend');
$httpBackend.expectGET('/api/v1/authentication').respond({status: 'success', data: null});
$resource = $injector.get('$resource');
callback = jasmine.createSpy();
scope = $rootScope.$new();
controller = new $controller('Login', {
$scope: scope,
$http: $http,
$location: $location,
authentication: authentication,
session: session
});
}));
afterEach(function() {
$httpBackend.verifyrifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should verify all default values for controller', function() {
expect(scope.username).toEqual('');
expect(scope.password).toEqual('');
expect(scope.displayApplicationLoad).toEqual(false);
expect(angular.isFunction(scope.login)).toEqual(true);
expect(angular.isFunction(scope.logout)).toEqual(true);
expect(scope.loggedIn).toEqual(false);
expect(scope.headerTemplate).toEqual('/templates/core/header.html');
expect(scope.footerTemplate).toEqual('/templates/core/footer.html');
});
});
問題は、メインモジュールの.run()メソッド内で実行されているコードが考慮されていないことです。
$httpBackend.expectGET('/api/v1/authentication').respond({status: 'success', data: null});
ライン。このコードを単体テストできるように、このロジックを別の場所に配置する必要がありますか?