1

resolveで私のui-routerの単体テストを書こうとしています。 userFactory.checkUser内ユニットテストUIルータ

Router.js

define(['module', 'require'], function(module, require) { 
    'use strict'; 

    var Router = function ($stateProvider, $urlRouterProvider) { 

     $urlRouterProvider.otherwise('/shopping'); 

     $stateProvider 
      .state('shopping', { 
       url: '/shopping', 
       templateUrl: 'app/shopping.html', 
       resolve:{ 
        userFactory : 'UserFactory', 
        checkAccess:function(userFactory){ 
         return userFactory.checkUser(); 
        } 
       } 
      }) 
      .state('products', { 
       url: '/products', 
       templateUrl: 'app/products.html', 
       resolve:{ 
        userFactory : 'UserFactory', 
        checkAccess:function(userFactory){ 
         return userFactory.checkUser(); 
        } 
       } 
      }) 
      .state('notAuth', { 
       url: '/notAuth', 
       templateUrl: 'app/unauthorised.html' 
      }); 
    }; 

    module.exports = ['$stateProvider', '$urlRouterProvider', Router]; 
}); 

()。私は基本的にユーザーの権利をチェックして、templateUrlのいずれかにリダイレクトする、または実行します。

$state.go('notAuth'); 

マイcurrect .spec.js:上記のテストで

define(['require', 'angular-mocks', 'angular-ui-router', 'app/router'], function (require) { 
    'use strict'; 
    describe('myApp/myState', function() { 

     var $rootScope, $state, $injector, myServiceMock, $httpBackend, state = 'shopping'; 

     var mockResponse = { 
      "access": true 
     } 

     var angular = require('angular'); 
     var myRouter = require('app/router'); 

     beforeEach(module('ui.router')); 

     beforeEach(function() { 

      module(myRouter, function($provide) { 
       $provide.value('userFactory', myServiceMock = {}); 
      }); 

      inject(function(_$rootScope_, _$state_, _$injector_, $templateCache, _$httpBackend_) { 
       $rootScope = _$rootScope_.$new(); 
       $state = _$state_; 
       $injector = _$injector_; 
       $httpBackend = _$httpBackend_; 
       $rootScope.$digest(); 
      }) 
     }); 

     it('should transition to shopping', inject(function($state,$rootScope){ 
      $state.transitionTo('shopping'); 
      $rootScope.$apply(); 
      expect($state.current.name).toBe('shopping'); 
     })); 

     it('should resolve data', function() { 
      myServiceMock.checkUser = jasmine.createSpy('checkUser').and.returnValue(mockResponse); 
      // earlier than jasmine 2.0, replace "and.returnValue" with "andReturn" 

      $state.go(state); 
      $rootScope.$digest(); 
      expect($state.current.name).toBe(state); 
     }); 
    }); 
}); 

、私は次のエラーを取得します:

Information: myApp/myState 
Information: should transition to shopping Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting! 
Information: Watchers fired in the last 5 iterations: [] 
Information: http://errors.angularjs.org/1.4.0/$rootScope/infdig?p0=10&p1=%5B%5D 

Information: should resolve data Expected '' to be 'shopping'. 

答えて

3

ここではいくつか起こっているようです。まず、あなたは何度も消化しています。これは "10 $のダイジェスト(反復回数)"メッセージです。その問題を修正するには、注入機能の最後から$rootScope.$digest()を削除する必要があります。

あなたのルートに設定した解決策を解決していないため、実際にテストに失敗したと思います。 $provide.valueの設定に$provide.value('checkAccess', function() {return true;});を追加してみてください。これにより、あなたのルートでcheckAccessが解決され、ルートが状態遷移を完了できるようになります。

似たような質問に対する私の答えはここにあります:Angular Jasmine UI router inject resolve value into test

関連する問題