在AngularJS中测试配置函数时如何模拟提供程序?

时间:2014-11-05 20:18:31

标签: angularjs unit-testing karma-jasmine

我有一个带有此签名的配置功能:

tmsNav = angular.module('tmsNav', ['tmsAuthSvc', 'tmsConfig', 'ui.router'])
tmsNav.config(function ($stateProvider, $urlRouterProvider, statesConfig) {
    // uses the constant statesConfig to configure $stateProvider and $urlRouterProvider
});

这是我的描述块:

describe('tmsNav.config() >', function () {
    it('configures states correctly', function () {
        module('tmsConfig', function ($provide) {
            $provide.constant('statesConfig', states1);
            $provide.factory('$state', function () {
                return {
                    state: function () {
                        console.log('state()!!!');
                    }
                };
            });
        });
        module('tmsNav');
        inject(function ($state) {
            expect($state.get().length).toBe(4);
        });
    });
});

常量被成功覆盖,但$ stateProvider不是。我尝试过使用$provide.factory('$state', ...)$provide.constant('$stateProvider', ...)$provide.value('$state', ...)等等......没有任何效果。

我需要模拟$ stateProvider,因为一旦配置它就会保留该配置进入下一个测试。因此,当我运行后续测试时,如果不应该,我会收到有关重复配置值的错误。

1 个答案:

答案 0 :(得分:2)

答案在于module()语句。我试图在错误的模块上覆盖$ stateProvider。

module('tmsConfig', function ($provide) {
    $provide.constant('statesConfig', states1);
});
module('ui.router', function ($provide) {
    $provide.provider('$state', function () {
        this.state = function () {
            console.log('state()!!!');
        };
        this.$get = function () {
            return {
                get: function () {
                    return [];
                }
            };
        };
    });
});
module('tmsNav');

如果我将长度期望值减小到零,则此编辑会导致测试通过。这不是我想要的测试,所以我会用间谍编写一个更强大的模拟,现在提供者问题得到解决。