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

使用Jasmine+TypeScript编写Angular单元测试时inject未定义问题求助

解决AngularJS + Jasmine + TypeScript测试中的ReferenceError: inject is not defined错误

这个错误的核心原因是测试代码中调用的inject函数没有被正确加载——inject是AngularJS官方测试工具库angular-mocks提供的全局函数,我们可以从以下几个方面排查并修复:

1. 确认angular-mocks的安装与引入路径

首先检查你的SpecRunner.html配置:

  • 你已经引入了angular-mocks.js,但要确保文件路径正确,且angular-mocks已通过npm安装完成:
    • 执行安装命令:npm install angular-mocks --save-dev
    • 验证../../node_modules/angular-mocks/angular-mocks.js路径是否匹配实际文件位置(如果你的SpecRunner.html在test/spec/目录下,这个路径是正确的)

2. 修正测试代码的写法

你的测试代码存在两处关键问题:

  • 直接用angular.module('app.people', [])是创建模块,而测试场景下应该用angular-mocks提供的module函数来加载已存在的目标模块
  • 直接调用inject可能因全局上下文问题无法识别,建议显式使用angular.mock.inject确保函数可访问

修改后的测试代码如下:

beforeEach(() => {
  // 加载要测试的Angular模块(替换为你实际的应用模块名)
  module('app.people');

  // 显式使用angular.mock.inject注入依赖
  angular.mock.inject(($injector: ng.auto.IInjectorService) => {
    $controller = $injector.get<ng.IControllerService>('$controller');
    $rootScope = $injector.get<ng.IRootScopeService>('$rootScope');
    massterControllerParams = { 
      $rootScope: $rootScope, 
      eventNames: vdog.eventNames 
    };
  });

  sut = $controller<vdog.MasterController>('masterController', massterControllerParams);
});

3. 补充TypeScript类型定义

由于你使用TypeScript,需要安装对应的类型定义文件,让编译器识别angular-mocks的API:

npm install @types/angular @types/angular-mocks --save-dev

额外验证点

  • 确认angular.js的引入顺序在angular-mocks.js之前(你的SpecRunner配置已经做对了,这个顺序绝对不能颠倒)
  • 如果仍然报错,可以在测试代码顶部添加全局声明,强制识别inject函数:
    declare var inject: (fn: Function) => void;
    

内容的提问来源于stack exchange,提问作者Amro Massalha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:52