vscode本身不执行js单元测试,仅调用jest/vitest等本地工具;插件失效、测试不显示、断点不触发,90%因终端中jest/vitest命令无法运行或testmatch配置未覆盖测试文件,必须先验证npx jest --version等能输出版本号,并在launch.json中显式添加--runinband参数。

VSCode 本身不验证 JS 单元测试,只调用 Jest/Vitest 等工具执行;插件失效、测试不显示、断点不触发,90% 是因为 jest 或 vitest 命令在终端里根本跑不通,或者配置没对齐。
确认本地测试命令能直接运行
这是所有操作的前提。VSCode 插件(比如 Test Explorer UI 或 orta.vscode-jest)只是封装了你本地的可执行文件,不会帮你装依赖,也不会自动读取 package.json 中的 "test" 脚本。
- 在 VSCode 集成终端中执行
npx jest --version或npx vitest --version,必须输出版本号(如29.7.0或2.1.8) - 如果报
command not found,说明没装:运行npm install --save-dev jest @types/jest(Jest)或npm install --save-dev vitest @vitest/coverage-v8(Vitest) - 别用
npm install -g jest—— 插件默认找node_modules/.bin/jest,全局安装常导致路径错乱或版本冲突 - 用 pnpm?改用
pnpx jest --version;用 yarn?用yarn vitest --version
测试文件必须被 testMatch 正确识别
VSCode 测试面板靠框架配置扫描文件,配错就等于“看不见”——图标不亮、右键无菜单、点运行没反应。
- Jest 默认
testMatch是["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)"],不会匹配src/utils/format.unit.ts或tests/api.test.js - 如果你的测试文件带
.unit.后缀,加一条:"**/*.unit.{js,ts,tsx}" - 如果你统一放在
src/tests/下,改成:"<rootdir>/src/tests/**/*.{test,spec}.{js,ts,tsx}"</rootdir> - 别同时写
testMatch和testRegex——testMatch优先级更高,后者会被忽略
调试单个测试必须加 --runInBand
Jest/Vitest 默认多进程并行,而 VSCode 的 Node.js 调试器只能 attach 到主进程。不加这个参数,断点基本不触发,或只在某个子进程里静默停住。
- 手动写进
.vscode/launch.json才可靠,不要依赖插件“自动加” - 示例配置(Jest):
{ "type": "node", "request": "launch", "name": "Debug Jest Tests", "program": "${workspaceFolder}/node_modules/.bin/jest", "args": ["--runInBand", "--testNamePattern", "should format date"], "console": "integratedTerminal" } - Vitest 用户注意:
vitest的调试需设"--mode", "test"并确保vitest.config.ts中未启用poolOptions.threads.singleThread: true冲突项 -
jest.config.js中若有maxWorkers,务必设为1或删掉,否则和--runInBand冲突
JS 单元验证依赖真实环境模拟
纯 JS 项目不需要 mock vscode,但若涉及 DOM、fetch、定时器等浏览器/Node 特有 API,就得主动处理,否则测试会因环境缺失而 fail。
- DOM 操作(如
document.createElement):用jsdom配置 Jest 的testEnvironment: 'jsdom',或 Vitest 的environment: 'jsdom' - 网络请求(
fetch):用msw(Mock Service Worker)拦截请求,或 Jest 的jest.mock('node-fetch'),避免真实发包 - 定时器(
setTimeout):用jest.useFakeTimers()+jest.runAllTimers()控制时间流 - Node 文件系统(
fs):用mock-fs替换真实路径,防止测试污染磁盘或读不到文件
真正卡住人的地方,往往不是语法或插件,而是测试命令在终端里跑不通、testMatch 漏掉了你的文件名模式、或者忘了 --runInBand —— 这些问题不解决,装再多插件也白搭。











