AngularJS服务单元测试报错:$urlMatcherFactoryProvider未知
解决AngularJS测试中$urlMatcherFactoryProvider注入失败的问题
这个错误Error: [$injector:unpr] Unknown provider: $urlMatcherFactoryProvider <- $urlMatcherFactory <- myExampleService本质是Angular的注入器找不到$urlMatcherFactory对应的提供者,原因很明确:$urlMatcherFactory属于ngRoute模块(不是Angular核心模块的服务),你的测试环境没有正确加载这个模块。
下面是具体的解决步骤:
1. 确保引入了angular-route.js脚本
首先检查你的Karma配置文件(karma.conf.js)的files数组,确认已经包含了angular-route.js,并且脚本加载顺序正确:
files: [ // 基础依赖顺序不能乱 'path/to/angular.js', 'path/to/angular-resource.js', 'path/to/angular-route.js', // 必须添加这一行 'path/to/angular-mocks.js', // 你的服务文件和测试文件 'src/app/services/example.service.js', 'src/app/services/example.service.spec.js' ]
2. 在测试中加载包含ngRoute的模块
如果你的myExampleService所在的应用模块已经依赖了ngRoute(比如应用模块定义是angular.module('myApp', ['ngResource', 'ngRoute'])),那测试时直接加载这个应用模块即可:
describe('myExampleService', function() { var service; // 加载应用模块,它已经包含了ngRoute依赖 beforeEach(module('myApp')); beforeEach(inject(function(_myExampleService_) { service = _myExampleService_; })); it('should be initialized correctly', function() { expect(service).toBeDefined(); }); });
如果你的服务是在单独的子模块中(比如myApp.services),要确保这个子模块已经依赖了ngRoute:
// 服务所在模块的定义 angular.module('myApp.services', ['ngResource', 'ngRoute']) .service('myExampleService', ['$resource', '$http', '$urlMatcherFactory', function($resource, $http, $urlMatcherFactory) { // 服务逻辑 }]);
然后测试时加载这个子模块:
beforeEach(module('myApp.services'));
3. 直接在测试中声明依赖ngRoute(备选方案)
如果不想修改应用模块的依赖,也可以在测试的模块加载阶段直接引入ngRoute:
beforeEach(module('ngRoute', 'ngResource', 'myApp.services'));
关键原理
Angular的依赖注入系统只会加载你明确声明的模块,$urlMatcherFactory不是核心API,必须通过引入ngRoute模块才能让注入器识别它的提供者。只要确保脚本引入和模块依赖都正确,这个错误就能解决。
内容的提问来源于stack exchange,提问作者Jonathan Jekaboh
相关产品推荐
相关产品推荐

