使用TypeScript时Mocha无法找到测试文件的问题排查
排查覆盖率异常100%且退出码1的问题
结合你的配置和现象,我整理了几个最可能的原因及对应的解决方案:
1. nyc未正确指定要检测的源码范围
这是最常见的导致"虚假100%覆盖率"的原因:默认情况下nyc不会自动识别你的src目录(从文件夹结构推断你有源码存放在这里),它只会统计执行到的文件——而你的测试文件肯定是100%被执行的,所以就出现了不符合预期的100%覆盖率。同时如果nyc找不到要检测的目标源码文件,可能会静默返回错误码1。
解决方法:
在package.json中添加nyc的配置块,明确指定要包含的源码和排除的文件:
"nyc": { "include": ["src/**/*.ts"], "exclude": ["test/**/*", "node_modules/**/*"], "extension": [".ts"] }
2. 脚本中的括号导致子进程异常
你当前的测试脚本用了(nyc mocha --opts ...)的子进程写法,在部分环境下,子进程的错误输出可能被吞掉,而且子进程的退出码会直接导致整个命令失败。
解决方法:
去掉多余的括号,简化脚本:
"test": "yarn seed && nyc mocha --opts ./test/mocha.unit.opts"
这样能确保nyc的所有输出都正常显示,也能正确传递执行过程中的错误信息。
3. TypeScript与nyc的兼容性配置缺失
因为你用了ts-node/register实时编译TypeScript,nyc需要额外配置才能正确捕获编译后的代码覆盖率,否则可能出现统计异常或静默失败。
解决方法:
- 安装TypeScript专属的nyc配置包:
yarn add -D @istanbuljs/nyc-config-typescript
- 在
package.json的nyc配置中引入这个预设:
"nyc": { "extends": "@istanbuljs/nyc-config-typescript", "include": ["src/**/*.ts"], "exclude": ["test/**/*"] }
4. 查看详细错误日志定位问题
目前你看不到报错信息,很难精准定位。可以修改脚本开启nyc的 verbose 模式,强制输出详细执行日志:
"test": "yarn seed && nyc --verbose mocha --opts ./test/mocha.unit.opts"
通过详细日志你能看到nyc在收集覆盖率时的每一步操作,更容易找到问题所在。
内容的提问来源于stack exchange,提问作者Shamoon
相关产品推荐
相关产品推荐

