2016-04-10 10 views
0
Aşağıda

Ben ui-router İştebirim test arayüzü-yönlendirici yapılandırma, ui-yönlendiricinin çözmek işlevini verir hizmet vaadi

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/'); 
    } 

kullanarak Uygulamam için sahip örnek rota yapılandırması çözüldü sonra bile beklenti sırasında söz ederken Şu an için sahip olduğum yukarıdaki kodun özelliğidir. View1 durumu için çözüm işlevi view1Service bağımlı olduğundan View1Service alay ettim ve bir söz vermemeye karar verdiyseniz (söz, alay hizmetinden döndürülmezse sonsuz sindirim() döngüsü oluşuyordu).

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 

     }); 

    }); 

Şu anda geçerli durumu iddia edebiliyorum. Çözüm işlevinin başarı ve başarısızlık geri dönüşlerini de test etmek istiyorum.

Ancak elde aşağıdaki hatayı tutmak:

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

çözmek blok olarak yukarıdaki Promise nesne dönen tutar konusunda herhangi bir fikriniz. Her şeyden önce, view1Service çözüldüğü için bir söz vermemeliydi. Ve benim engellemek için bile olsa bile, blok çağırma bir cevabı döndürürse ifadesinin beklemesine kadar beklemiyor mu? Ben de çağırmayı denedim, o da işe yaramadı.

Herhangi bir yardım

çok takdir edilmektedir.

cevap

-1

Çözme işlevlerini çağıran duruma geçiyorsunuz ve sonra ertelenmiş durumunuzu "çözümleyebilirsiniz". Her şey yolunda. Ama sonra daha sonra init fonksiyonunu çağırırsınız, bu da bir söz verir, ki bu iyi bir şeydir. Ama bundan sonra ertelenmek istiyorsun, şimdi ayarlandı.

Temel olarak, "$ state.go" dediğinizde ve bir kez daha sonra açıkça "init" kelimesini iki kez aradığınızı düşünüyorum.

Doğrudan test etmek istediğiniz init işlevini almak için öncelikle bir state.get ('view1') .inse.init yapabilmeniz gerekir. Aksi takdirde, "$ state.go" araması otomatik olarak çalışır.

Bu yardımcı olur umarım!