2016-04-10 16 views
0
以下

私はUI-ルータにここでユニットテストUI-ルータの設定、UI-ルータの解決関数が戻るとサービスの約束が

angular.module('myApp', ['ui.router']); 

    angular.module('myApp').config(stateConfig); 

    stateConfig.$inject = ['$stateProvider','$urlRouterProvider']; 

    function stateConfig($stateProvider, $urlRouterProvider) { 
     $stateProvider.state('view1', { 
      url: '/view1/:id?', 
      templateUrl: 'app/view1/view1.html', 
      resolve:{ 
       init: ['$stateParams', 'view1Service', function($stateParams, view1Service){ 
        if($stateParams.id !== ''){ 
         return view1Service.getIdData($stateParams.id) 
          .then(function(response){ 
           return { data: response.data, responseStatus: response.status };        
          }, function(response){ 
           return { data:{}, responseStatus: response.status }; 
          }); 
        } 
        else{ 
         return { data:{}, responseStatus: 200 }; 
        } 
       }] 
      }, 
      controller: 'View1Controller as controllerOne' 
     }) 
     //some other routes with similar configuration 

     $urlRouterProvider.otherwise('/view1/'); 
    } 

を使用して、myAppために持っているサンプルのルート設定で解決した後でさえも予想時に約束しながら、私が今持っている上記のコードの仕様です。私はview1Serviceを嘲笑しているし、約束を返すようにしています(mockedサービスから返されなかった場合、無限のdigest()ループが発生していました)。

describe('ui router config', function() { 

     var $rootScope, $state, $injector, myServiceMock, state = 'view2', deferred, mockedService; 

     beforeEach(function() { 
      angular.mock.module('myApp'); 
      angular.mock.module('ui.router'); 

      angular.mock.module(function($provide){ 
       $provide.factory('view1Service', function($q){ 
        function getIdData(id){ 
         deferred = $q.defer(); 
         return deferred.promise; 
        } 
        return {getIdData: getIdData} 
       }); 
      }); 

      inject(function(_$rootScope_, _$state_, _$injector_, $templateCache, _$stateParams_, view1Service) { 
        $rootScope = _$rootScope_; 
        $state = _$state_; 
        $injector = _$injector_; 
        $stateParams = _$stateParams_; 
        $templateCache.put('app/view1/view1.html', '') 
      }) 
     }); 

     it('should respond to URL', function() { 
      expect($state.href(state, { id: 1 })).toEqual('#/view1/1'); 
     }); 

     it('should resolve data', function() { 
      $state.go(state, {id: '9999'}); 
      deferred.resolve({ 
       data: 'some data', 
       status: 666 
      }); 
      $rootScope.$digest(); 
      expect($state).toBe('checking'); 
      expect($state.current.name).toBe(state+'q'); 

      // Call invoke to inject dependencies and run function 
      expect($injector.invoke($state.current.resolve.init)).toBe('findAll+1');//this assertion fails with below error 

     }); 

    }); 

現在、現在の状態をアサートできます。解決関数の成功と失敗のコールバックもテストしたいと思います。

Expected Promise({ $$state: Object({ status: 0 }) }) to be 'findAll+1'. 

解決ブロックは、上記のように約束オブジェクトを返し続ける理由を任意のアイデア:

しかし、私はエラー以下になっておきます。まずview1Serviceが解決されてから約束を返すべきではありません。そして、私の理解にブロックの呼び出しが約束を返す場合でも、ステートメントがその解決まで待つことを期待していますか?私は呼び出し呼び出しでも.thenを使ってみましたが、どちらもうまくいきませんでした。

ご迷惑をおかけして申し訳ありません。

答えて

-1

あなたは解決関数を呼び出す状態に移行していて、遅延したものを「解決」します。すべてここで良い。しかし、後でinit関数を呼び出すと、約束を返します。これは良いことです。しかし、この後に延期を解決したいと思っています。

基本的には、 "init"を2回、 "$ state.go"を呼び出すともう一度明示的に呼び出すと思います。

まず、$ state.get( 'view1')。resolve.initを実行して、直接テストしたいinit関数を取得することができます。それ以外の場合は、 "$ state.go"を呼び出すと自動的に実行されます。

希望に役立ちます!

関連する問題