Error: [$injector:unpr] Unknown provider - I think I've checked the obvious stuff
Error: [$injector:unpr] Unknown provider - I think I've checked the obvious stuff
在我的单元测试之前有效
var moduleName = 'gameModel';
var providerName = 'gameConstants';
angular.module(moduleName);
inject(function($injector) {
$injector.get(providerName);
});
我已经从模块和常量实现本身复制粘贴了模块名称和提供程序名称,所以我很确定这不是名称中的拼写错误。 Karma 正在按以下顺序加载文件:
- 角度
- 角度模拟
- 包含模块 "gameModel" 的 js 文件 - 没有依赖项
- 包含常量提供程序的 js 文件 "gameConstants" - 没有依赖关系
- 单元测试文件.js.
我 认为 这涵盖了显而易见的东西(我认为我对 Angular 还很陌生)- 名称似乎没问题,在它应该之前不应该尝试注入任何东西.但我仍然收到未知提供程序异常。
我已经研究了几个小时,发现了这个我不明白的怪事:
var moduleName = 'gameModel';
var providerName = 'gameConstants';
angular.module(moduleName);
inject(function($injector){
console.log('Inject method, injector has provider: ', $injector.has(providerName));
console.log('First provider name: ', angular.module(moduleName)._invokeQueue[0][2][0]);
});
var fooInjector = angular.injector([moduleName]);
console.log('Explicitly rolled injector has provider: ', fooInjector.has(providerName));
通过注入方法 has
方法 returns 错误,但奇怪的是 我可以从模块本身 中获取提供者名称。如果我推出自己的注入器(inject
方法之外的代码),那么 has
就可以工作,我什至可以找到提供者。任何人都可以阐明为什么会发生这种情况 - 在我看来,我似乎以某种方式为 $inject
和 fooInjector
安装了不同的注射器
简答
我认为您的问题是您使用的是 angular.module
而不是 module
或 angular.mock.module
.
长答案
Angular 模拟库创建模拟模块和注入函数。它必须这样做,因为模块的非模拟版本和注入必须仍然能够正常运行,因此您实际上可以 运行 并测试您的 Angular 代码。
因此,当您将 $injector
服务注入模拟注入函数时,模拟库不知道 'gameConstants'
常量,因为您实际上没有告诉模拟模块有关 'gameModel'
模块。
希望对您有所帮助。
在我的单元测试之前有效
var moduleName = 'gameModel';
var providerName = 'gameConstants';
angular.module(moduleName);
inject(function($injector) {
$injector.get(providerName);
});
我已经从模块和常量实现本身复制粘贴了模块名称和提供程序名称,所以我很确定这不是名称中的拼写错误。 Karma 正在按以下顺序加载文件:
- 角度
- 角度模拟
- 包含模块 "gameModel" 的 js 文件 - 没有依赖项
- 包含常量提供程序的 js 文件 "gameConstants" - 没有依赖关系
- 单元测试文件.js.
我 认为 这涵盖了显而易见的东西(我认为我对 Angular 还很陌生)- 名称似乎没问题,在它应该之前不应该尝试注入任何东西.但我仍然收到未知提供程序异常。
我已经研究了几个小时,发现了这个我不明白的怪事:
var moduleName = 'gameModel';
var providerName = 'gameConstants';
angular.module(moduleName);
inject(function($injector){
console.log('Inject method, injector has provider: ', $injector.has(providerName));
console.log('First provider name: ', angular.module(moduleName)._invokeQueue[0][2][0]);
});
var fooInjector = angular.injector([moduleName]);
console.log('Explicitly rolled injector has provider: ', fooInjector.has(providerName));
通过注入方法 has
方法 returns 错误,但奇怪的是 我可以从模块本身 中获取提供者名称。如果我推出自己的注入器(inject
方法之外的代码),那么 has
就可以工作,我什至可以找到提供者。任何人都可以阐明为什么会发生这种情况 - 在我看来,我似乎以某种方式为 $inject
和 fooInjector
简答
我认为您的问题是您使用的是 angular.module
而不是 module
或 angular.mock.module
.
长答案
Angular 模拟库创建模拟模块和注入函数。它必须这样做,因为模块的非模拟版本和注入必须仍然能够正常运行,因此您实际上可以 运行 并测试您的 Angular 代码。
因此,当您将 $injector
服务注入模拟注入函数时,模拟库不知道 'gameConstants'
常量,因为您实际上没有告诉模拟模块有关 'gameModel'
模块。
希望对您有所帮助。