Istanbul代码覆盖率无法正常工作问题排查求助
我之前也碰到过类似的情况——测试能正常跑通,但覆盖率全是Unknown,大概率是Babel和覆盖率工具的插装逻辑没配合好。结合你的配置来看,主要是旧版NYC的兼容性、Babel配置缺失和脚本参数不合理这几个问题,给你一步步来调整:
1. 升级NYC并替换旧工具
你用的NYC 10.0.0版本太老了,对Babel 6的支持不够完善。先升级到最新稳定版,同时废弃isparta和旧版istanbul(现在NYC配合babel-plugin-istanbul就足够实现ES6代码的覆盖率统计):
npm uninstall isparta istanbul npm install nyc@latest babel-plugin-istanbul --save-dev
2. 配置Babel插入覆盖率代码
新建或修改你的.babelrc文件,添加测试环境的插件配置,这样只有在测试时才会插入覆盖率统计代码,不会影响正常开发:
{ "presets": ["es2015"], "env": { "test": { "plugins": ["istanbul"] } } }
3. 修复package.json中的测试脚本
你的脚本里用了Mocha已废弃的--compilers参数,而且没有明确指定要覆盖的源文件路径,NYC找不到统计目标才会显示Unknown。修改成下面的配置(注意把src/**/*.js换成你实际的源文件目录,比如lib/**/*.js):
"scripts": { "test": "cross-env NODE_ENV=test mocha test/*.js --require babel-register", "test:cover": "cross-env NODE_ENV=test nyc --include 'src/**/*.js' npm run test" }
这里用--require babel-register代替--compilers(Mocha v4+已废弃--compilers参数),同时通过--include明确告诉NYC要统计哪些文件。
4. 配置NYC排除不必要的文件
在package.json里添加NYC的专属配置,排除测试文件、node_modules等不需要统计的内容:
"nyc": { "exclude": [ "test/**/*.js", "node_modules/**/*" ] }
验证操作
最后删除node_modules和package-lock.json,重新安装依赖,再运行覆盖率命令:
rm -rf node_modules package-lock.json npm install npm run test:cover
这样应该就能正常生成覆盖率数据了。如果还是有问题,可以检查下你的源文件路径是否和--include里的配置匹配,或者有没有其他Babel插件干扰了覆盖率插装。
内容的提问来源于stack exchange,提问作者Why

