使用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
相关产品推荐
相关产品推荐

