2014-12-02 89 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'); 
    }); 
}); 

其中的伎俩。