2016-03-23 16 views
0

ログインして、ログインページにリダイレクトします。今私はカルマ - ジャスミン単位テストでこれをテストしたいと思っています。しかし、私がテストを書くと、location.pathは変化しません。AngularJS、ルート解決、場所の変更、ユニットテスト、カルマ・ジャスミン

describe('LoginController', function() { 
    beforeEach(module('dcApp')); 

    beforeEach(function() { 
     var _authenticated = false; 

     AuthAuthenticatorMock = { 
      isAuthenticated: function() { 
       return _authenticated 
      }, 

      setAuthenticated: function(authenticated) { 
       _authenticated = authenticated; 
      }, 
     }; 

     module(function($provide) { 
      $provide.value('AuthAuthenticator', AuthAuthenticatorMock); 
     }); 
    }); 

    var $controller; 

    beforeEach(inject(function(_$route_, _$location_, _$controller_, _AuthAuthenticator_){ 
     // The injector unwraps the underscores (_) from around the parameter names when matching 
     $route = _$route_; 
     $location = _$location_; 
     $controller = _$controller_; 
     AuthAuthenticator = _AuthAuthenticator_; 
    })); 

    describe('Controller activation', function() { 
     it ('redirects to login if user is not yet logged in', function() { 
      AuthAuthenticator.setAuthenticated(false); 
      var $scope = {}; 
      var controller = $controller('HomeController', { $scope: $scope }); 
      expect($location.path()).toBe('/login'); 
     }); 
    }); 

}); 

しかし、結果は次のとおりです。

PhantomJS 2.1.1 (Linux 0.0.0) HomeController Controller activation redirects to login if user is not yet logged in FAILED 
Expected '' to be '/login'. 

今私はスパイにいくつかのドキュメントを見てきましたが、私はこの場所の変更をチェックする方法を得ることはありません。

答えて

0

エコーが発生する前に解決を呼び出すことで、これを適切にテストできます。

describe('LoginController', function() { 
    beforeEach(module('dcApp')); 

    beforeEach(function() { 
     var _authenticated = false; 

     AuthAuthenticatorMock = { 
      isAuthenticated: function() { 
       return _authenticated 
      }, 

      setAuthenticated: function(authenticated) { 
       _authenticated = authenticated; 
      }, 
     }; 

     module(function($provide) { 
      $provide.value('AuthAuthenticator', AuthAuthenticatorMock); 
     }); 
    }); 

    beforeEach(function() { 
     var _path = ''; 

     locationMock = { 
      path: function(argument) { 
       if (argument) { 
        _path = argument; 
       } 
       return _path; 
      } 
     }; 

     module(function($provide) { 
      $provide.value('$location', locationMock); 
     }); 
    }); 

    var $controller; 

    beforeEach(inject(function(_$route_, _$location_, _$controller_, _AuthAuthenticator_){ 
     // The injector unwraps the underscores (_) from around the parameter names when matching 
     $route = _$route_; 
     $location = _$location_; 
     $controller = _$controller_; 
     AuthAuthenticator = _AuthAuthenticator_; 
    })); 

    describe('Controller activation', function() { 
     it ('redirects to login if user is not yet logged in', function() { 
      AuthAuthenticator.setAuthenticated(false); 
      var resolveTest = $route.routes['/home'].resolve.Authenticated; 
      $injector.invoke(resolveTest); 
     // if it's a promise call apply 
      $rootScope.$apply(); 
      expect($location.path()).toBe('/login'); 
     }); 
    }); 

}); 
関連する問題