测试依赖于$ state的服务

时间:2014-12-02 16:15:50

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

我一直在尝试为我的 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以针对任意状态进行测试?

1 个答案:

答案 0 :(得分:0)

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

我在通过$state进行配置之前加载$stateProvider,此外,我没有注入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');
    });
});

这就是诀窍。