为什么我的NYC代码覆盖率工具在ESM环境下无法正常工作?
覆盖率统计为0的原因及解决方法
- ESModule 兼容问题
你在项目中配置了"type": "module"使用ESModule规范,而旧版本的nyc默认仅支持CommonJS模块的代码插桩,你使用的--require esm参数无法让nyc正确识别ESM模块的执行逻辑,插桩失败后自然统计不到代码覆盖率。
解决方法:
- 升级nyc到最新版本,在package.json中新增nyc配置:
{ "nyc": { "extensions": [".mjs"], "include": ["**/*.mjs"], "exclude": ["**/*.spec.mjs"] } }
- 修改测试命令为:
"test": "NODE_OPTIONS=--experimental-vm-modules nyc mocha --recursive './**/*.spec.mjs'"
如果配置后仍不生效,建议直接替换为c8工具,它基于Node.js原生V8覆盖率能力,对ESM兼容性更好,仅需要安装c8依赖后将命令中的nyc替换为c8即可。
- 路径匹配错误
你当前测试命令指定的测试文件路径为./lib/**/*.spec.mjs,如果你的测试文件、源码文件没有存放在lib目录下,nyc默认不会主动扫描lib目录外的源码文件,导致没有统计到App.mjs的执行数据。
解决方法:
确认项目文件存放结构,将测试命令的路径匹配规则修改为你实际存放测试文件的路径,同时在nyc的配置中明确指定include字段覆盖你的源码存放路径。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

