Code Runner 仅支持一键运行 JS 文件,不支持 Jest 测试;正确方式是配置 launch.json 指向本地 jest 二进制、使用 npm script 联动任务,并配 jest.config.js 显式声明 testMatch 等选项。

用 Code Runner 一键运行 JS 文件,但别依赖它做测试
Code Runner 确实能让你按 Ctrl+Alt+N(Windows)或 Cmd+Option+N(Mac)就执行当前 .js 文件,适合写小脚本、验证语法或跑 LeetCode 单文件逻辑。但它不加载 package.json 中的测试脚本,也不支持断点调试、覆盖率报告或 Jest/Mocha 的测试生命周期。
常见错误现象:console.log 能输出,但 expect 报错 ReferenceError: expect is not defined;或者你写了 test() 函数,运行后却“什么都没发生”——因为 Code Runner 只是调用 node yourfile.js,不是 jest yourfile.test.js。
- 只适用于无依赖、无断点、无断言的纯执行场景
- 无法识别
describe/it块,也不会自动查找*.test.js文件 - 若文件里用了
import但没配 Babel 或 ES modules 支持,会直接报SyntaxError: Cannot use import statement outside a module
配置 launch.json 启动 Jest 测试,必须改 program 和 args
VSCode 调试器本身不内置 Jest 支持,得靠 launch.json 显式告诉它:“用 Node 执行 jest 命令,而不是执行你的源文件”。否则 F5 一按,它默认跑的是 node ./src/index.js,不是 jest。
正确做法是在项目根目录的 .vscode/launch.json 里加一个配置:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Jest Current File",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["${fileBasenameNoExtension}"],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"disableOptimizations": true,
"env": { "NODE_OPTIONS": "--enable-source-maps" }
}
]
}
-
program必须指向本地安装的jest二进制(node_modules/.bin/jest),不是全局jest—— 全局命令路径不稳定,CI/他人机器上大概率失败 -
args传${fileBasenameNoExtension}可让当前打开的xxx.test.js被单独运行,避免全量跑测试拖慢反馈 - 漏掉
"env": { "NODE_OPTIONS": "--enable-source-maps" }会导致断点打在转译后代码上,而不是你写的源码里
npm script + VSCode 任务联动,比插件更可靠
与其纠结哪个插件能“全自动”测 JS,不如把测试逻辑收归 package.json 的 scripts 字段。VSCode 的“运行任务”(Ctrl+Shift+P → Tasks: Run Task)能直接调用这些脚本,且天然兼容所有 npm 生态工具链。
例如,在 package.json 中定义:
"scripts": {
"test": "jest",
"test:watch": "jest --watch",
"test:debug": "node --inspect-brk node_modules/jest/bin/jest.js --runInBand"
}
- 运行
test:debug后,再在 Chrome 地址栏输入chrome://inspect→ 点击“Open dedicated DevTools for Node”,就能图形化调试 Jest 运行过程 -
--runInBand强制单线程执行,避免多进程下断点失效或日志混乱 - 所有参数(如
--coverage、--verbose)都可直接加在 script 里,不用反复改launch.json
Jest 配置文件缺失时,jest.config.js 是绕不开的坎
很多新手卡在“F5 没反应”或“测试文件被忽略”,根本原因常是 Jest 没找到匹配的文件。VSCode 不会替你猜:它默认只认 __tests__ 目录或 *.spec.js/*.test.js,但如果你用 src/tests/ 或 .ts 后缀,就必须显式声明。
最小可用 jest.config.js 示例:
module.exports = {
testMatch: ["**/src/**/*.(spec|test).(js|ts)"],
transform: {
"^.+\.(js|ts)$": "babel-jest"
},
collectCoverageFrom: ["src/**/*.{js,ts}"]
};
- 没有
testMatch,Jest 可能完全跳过你的测试文件,连报错都不给 - 用 TypeScript 写测试?光装
@types/jest不够,必须配transform,否则import语法直接崩 - VSCode 的 JavaScript 语言服务不会读取
jest.config.js,所以类型提示和跳转会断——这是正常现象,别误以为配置错了
真正容易被忽略的是:Jest 的模块解析行为和 Node.js 本身不同,require('./utils') 在 Node 下可能走 utils.js,但在 Jest 里若没配 moduleFileExtensions,会直接报 Cannot find module。这种差异不在编辑器层面暴露,只在运行时浮现。


















