Vitest 是 Vite 驱动的快速测试框架,兼容 Jest API 并原生支持 ESM,适用于现代 JavaScript/TypeScript 项目的单元测试与集成测试。
主要能力:watch 模式提供开发时的即时反馈与智能文件监听;TypeScript/JSX 由 Vite 编译,无需额外配置;提供 mocking 生态,包括用 vi.mock() 模拟模块、MSW v2 模拟 HTTP 请求、fake timers 处理时间相关逻辑;支持快照测试,含自动管理与内联快照;支持并发测试,并具备隔离机制。
使用方式通常为:先确定测试范围(单元/集成/e2e)与依赖(HTTP、定时器、其他模块),再选择策略——模块用 vi.mock() 配合提升规则,HTTP 用 MSW,时间用 fake timers;若 mock 需要测试作用域中的变量,用 vi.hoisted() 提升共享状态;在 beforeAll() 中启动 MSW server,在 afterEach() 中重置处理器;使用断言与快照时只对稳定输出生成快照;最后用 vitest --watch 并结合覆盖率检查验证。相关规则覆盖模块模拟(vi.mock()、vi.hoisted()、importOriginal 部分模拟)、函数模拟(vi.fn())、方法监听(vi.spyOn())、HTTP 模拟(MSW v2 的 setupServer() 与逐测试覆盖)、假定时器(vi.useFakeTimers()、vi.setSystemTime())、快照、断言与 hooks/setup。
典型场景是前端或 Node 项目的 JavaScript/TypeScript 测试,尤其是需要快速反馈、模块隔离和 HTTP 模拟的项目。
限制与常见问题:vi.mock() 会被提升,放在条件语句中无效,应置于文件顶部,并用 vi.hoisted() 处理条件性 mock 状态;在 vi.mock() 工厂中访问外部变量会报初始化前错误,需用 vi.hoisted() 定义共享状态;MSW 处理器未被调用通常是 server 未启动或方法不匹配,应在 beforeAll() 调用 server.listen() 并核对请求动词;快照更新需人工审查,建议在 --ui 模式核对差异后再用 -u 接受;本地通过而 CI 失败常见于假定时器未重置,应在 afterEach() 调用 vi.useRealTimers()。该资料未提供收费、价格或平台支持等细节。