AngularJS项目升级Mocha至5.1.1后未执行全部测试用例求助
我之前也碰到过一模一样的情况,把Mocha从^2.2.5升级到5.x版本后,AngularJS测试套件直接炸了——一会儿漏跑测试用例,一会儿又报currentSpec is null的钩子错误。折腾了半天终于搞明白,这本质是Mocha 5.x的钩子执行逻辑改了,而旧版angular-mocks没跟上这个变化,再加上并行测试的坑,才导致了这些问题。
问题拆解
currentSpec is null报错:这个错来自angular-mocks的$$cleanup方法,Mocha 5.x调整了beforeEach/afterEach钩子的执行时机,等钩子触发时,Mocha内部的currentSpec已经被销毁了,angular-mocks自然没法正常清理模块。- 测试用例分批/遗漏:Mocha 5.x默认悄悄开了并行测试(或者你的Grunt配置间接触发了类似逻辑),但AngularJS的测试依赖全局的模块注入上下文,并行执行会把上下文搅乱,导致测试被拆成好几批跑,甚至直接跳过大量用例。
具体修复步骤
1. 升级angular-mocks到适配Mocha 5+的版本
你现在用的是bower版的angular-mocks,赶紧换成npm版的angular-mocks,并且升级到1.7.x及以上(这个版本专门修复了和Mocha 5+的兼容性问题):
- 先卸载bower的angular-mocks:
bower uninstall angular-mocks --save-dev - 安装适配版的npm包:
npm install angular-mocks@^1.7.0 --save-dev - 最后在测试入口文件(比如
test-main.js)里,把angular-mocks的引用路径改成node_modules下的对应文件。
2. 强制禁用Mocha并行测试
在Gruntfile.js的mocha任务配置里,加上parallel: false,强制串行执行所有测试:
mocha: { test: { options: { // 保留你原来的其他配置 parallel: false, reporter: 'spec' }, src: ['path/to/your/tests/**/*.js'] } }
另外,记得把grunt-mocha插件也升级到最新兼容版本,避免插件本身和Mocha 5.1.1不兼容:
npm install grunt-mocha@latest --save-dev
3. 手动清理模块(可选,升级后仍有报错时用)
如果升级angular-mocks后还有个别测试的钩子报错,可以在每个测试文件的afterEach里手动清理模块,不依赖angular-mocks的自动清理:
afterEach(function() { angular.mock.resetModule(); angular.mock.resetInjector(); });
4. 验证修复效果
重新跑测试命令:
grunt test
这时候应该能看到所有11550个测试用例被完整执行,currentSpec is null的错误也会消失。
额外提醒
你的环境里Angular CLI是6.0.1,但项目是AngularJS(1.x),别把两者的测试配置搞混了,确保测试任务是针对AngularJS的,不是Angular CLI的ng test。另外Node 9.4.0虽然能跑,但后续建议升级到LTS版本(比如10.x或12.x),减少潜在的兼容性坑。
内容的提问来源于stack exchange,提问作者Sherin Sunny

