我有一个带有此签名的配置功能:
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,因为一旦配置它就会保留该配置进入下一个测试。因此,当我运行后续测试时,如果不应该,我会收到有关重复配置值的错误。
答案 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');
如果我将长度期望值减小到零,则此编辑会导致测试通过。这不是我想要的测试,所以我会用间谍编写一个更强大的模拟,现在提供者问题得到解决。