【问题标题】:Testing a service that depends on $state测试依赖于 $state 的服务
【发布时间】:2014-12-02 16:15:49
【问题描述】:

我一直在尝试为我的 Progress Service 编写一个单元测试,它管理流的不同状态(跳转到下一个未完成的步骤、将步骤标记为完成等) p>

我正在尝试配置 $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 来测试任意状态?

【问题讨论】:

    标签: angularjs unit-testing angular-ui-router


    【解决方案1】:

    好的,这就是我认为发生的事情:

    我在通过$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');
        });
    });
    

    这可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2014-09-04
      • 2012-10-27
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多