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 正在按以下顺序加载文件:

  1. 角度
  2. 角度模拟
  3. 包含模块 "gameModel" 的 js 文件 - 没有依赖项
  4. 包含常量提供程序的 js 文件 "gameConstants" - 没有依赖关系
  5. 单元测试文件.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 就可以工作,我什至可以找到提供者。任何人都可以阐明为什么会发生这种情况 - 在我看来,我似乎以某种方式为 $injectfooInjector

安装了不同的注射器

简答

我认为您的问题是您使用的是 angular.module 而不是 moduleangular.mock.module.

长答案

Angular 模拟库创建模拟模块和注入函数。它必须这样做,因为模块的非模拟版本和注入必须仍然能够正常运行,因此您实际上可以 运行 并测试您的 Angular 代码。

因此,当您将 $injector 服务注入模拟注入函数时,模拟库不知道 'gameConstants' 常量,因为您实际上没有告诉模拟模块有关 'gameModel'模块。

希望对您有所帮助。