You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:46:40