vscode调试mocha/chai失败主因是program未指向_mocha且sourcemap未对齐;program必须设为"${workspacefolder}/node_modules/mocha/bin/_mocha",ts项目需加--require ts-node/register,异步测试必配--timeout,sourcemap需在tsconfig.json和launch.json中严格匹配。

VSCode 调试 Mocha/Chai 测试用例失败,八成不是代码写错了,而是调试器根本没真正启动 Mocha 环境——describe 报错、断点灰掉、异步测试秒退,全指向同一个根因:program 指向错误 + sourceMap 没对齐。
launch.json 的 program 必须指向 _mocha,不能是 mocha 或测试文件
VSCode 的 Node.js 调试器不走 shell,所以写 "program": "mocha" 会直接报 spawn mocha ENOENT;更危险的是写成 "program": "${file}",这等于让 Node 直接执行测试文件,Mocha 完全没加载,describe 和 it 当然未定义。
-
program应固定为:"${workspaceFolder}/node_modules/mocha/bin/_mocha"(跨平台稳定,绕过 .cmd/.sh 解析) - 测试路径必须放在
args里,例如:"${file}"(当前文件)或"test/**/*.spec.js"(整个目录) - 如果项目用 TypeScript,
args中必须加--require ts-node/register,否则.ts文件被 Node 原生执行,报语法错误 - ESM 项目(
package.json有"type": "module")要改用"program": "node",并加"runtimeArgs": ["--loader", "ts-node/esm"]和"args": ["node_modules/mocha/bin/mocha.js", ...]
异步测试必加 --timeout,否则 2s 就强制退出
Mocha 默认异步超时是 2000ms,但一个 setTimeout(3000) 或数据库查询很容易就超了。结果就是断点刚 hit 就结束,或者测试显示“passed”但实际逻辑根本没走完。
- 所有
args配置中必须显式包含--timeout,推荐设为"5000"或更高(如"15000") - 避免混用
done()和async/await:比如it('xxx', async () => { ... done(); })会触发 Mocha 冲突警告 - 用
console.log在关键位置打点,确认是否真进了异步回调——有时候断点不命中,只是因为 Promise 还没 resolve
TypeScript 项目断点不命中?检查 sourceMap 三件套
你在 src/index.ts 打的断点没反应,不是 VSCode 坏了,而是它正在调试 dist/index.js,却找不到或映射错了 dist/index.js.map。
-
tsconfig.json必须开启:"sourceMap": true,且"outDir"和"rootDir"要匹配(如"outDir": "./dist","rootDir": "./src") -
test/*.spec.ts也得在tsconfig.json的"include"里,否则不会生成对应 map 文件 -
launch.json中启用"sourceMaps": true,并设置"outFiles"精确匹配编译输出,例如:["${workspaceFolder}/dist/**/*.js"] - 删掉
.ts-node缓存目录再试;重启调试会话(不是“继续”),必要时关 VSCode 重开
最常被忽略的点:sourceMap 路径是相对的,但 outFiles 是绝对的;哪怕只差一级目录,断点就永远灰着。别信“应该可以”,用 console.log(__filename) 打印运行时路径,再比对 outFiles 是否真能覆盖到它。











