2014-12-02 66 views
1

我一直在爲我的Progress Service編寫一個單元測試,它管理一個流程的不同狀態(跳轉到下一個未完成的步驟,將步驟標記爲完整等等)。 )

我想配置$ stateProvider來創建一組狀態,然後測試服務對它,但我無法得到狀態更改。當然,我想以一種孤立的方式來測試它,所以不依賴於我的應用程序中的現有狀態。

下面是簡單的單元測試:

ddescribe('Progress Steps Service', function() { 

    var sut, $rootScope, $state; 

    // holds ui.router and ProgressStepsService deps 
    beforeEach(module('Core')); 

    beforeEach(inject(
     function(_$rootScope_, _$state_) { 
      $rootScope = _$rootScope_; 
      $state = _$state_; 
     } 
    )); 

    beforeEach(inject(function(ProgressStepsService) { 
     // var steps = [...]; 
     // sut = ProgressStepsService; 
     // sut.resolve(steps); 

     angular.module('TestModule', []).config(function($stateProvider) { 
      $stateProvider 
       .state('root', {url: '/root', abstract: true}) 
       .state('root.step1', {url: '/step1'}) 
       .state('root.step2', {url: '/step2'}) 
       .state('root.step3', {url: '/step3'}); 
     }); 

     $state.go('root.step1'); 
     $rootScope.digest(); 
    })); 

    it('should init from the first step', function() { 
     expect($state.$current.name).toBe('root.step1'); 
    }); 
}); 

我得到的錯誤是

Error: Could not resolve 'root.step1' from state '' 

我拿''是默認狀態,由於某種原因,配置狀態不通航。我可能錯過了一些非常基本的東西。

我應該如何配置$stateProvider來測試任意狀態?

回答

0

好了,這裏就是我的想法是怎麼回事:

我通過$stateProvider配置之前加載$state,除此之外,我沒有注射TestModule。

我已經更新的代碼看起來像這樣:

ddescribe('Progress Steps Service', function() { 
    var sut, $state, $rootScope; 

    beforeEach(function() { 
     // var steps = [...]; 
     // sut = ProgressStepsService; 
     // sut.resolve(steps); 

     angular.module('TestModule', []).config(function($stateProvider) { 
      $stateProvider 
       .state('root', {url: '/root', abstract: true}) 
       .state('root.step1', {url: '/step1'}) 
       .state('root.step2', {url: '/step2'}) 
       .state('root.step3', {url: '/step3'}); 
     }); 

     module('Core', 'TestModule'); 
     inject(function(){}); 
    }); 

    beforeEach(inject(
     function(_$state_, _$rootScope_) { 
      $state = _$state_; 
      $rootScope = _$rootScope_; 
     } 
    )); 

    it('should transition to the first incomplete state', function() { 
     $state.go('root.step1'); 
     $rootScope.$digest(); 
     expect($state.$current.name).toBe('root.step1'); 
    }); 
}); 

其中的伎倆。