如何针对编译后的JavaScript运行Vitest?报错求助
解决Vitest中
vi对象未定义的错误 问题根源
你遇到的TypeError: Cannot read properties of undefined (reading 'spyOn')或mock类错误,本质是Vitest的vi对象未被正确注入到测试环境中,结合你的配置和代码,主要有几个明确的触发原因:
修复步骤
1. 处理全局模式与显式导入的冲突
你的tsconfig.json中已配置"types": ["vitest/globals"],这会启用Vitest的全局变量模式——vi、it、describe等API无需导入即可直接使用。但你的测试代码又显式导入了vi,这会导致变量加载冲突。
两种解决方式二选一:
- 保留全局模式:移除测试代码中的显式导入,直接使用全局
vi// index.test.ts // 删除 import { vi, it, describe, beforeAll, expect, afterEach } from 'vitest' vi.mock('some module') describe('测试套件', () => { beforeAll(() => { /* ... */ }) afterEach(() => { /* ... */ }) it('测试用例', () => { expect(true).toBe(true) }) }) - 关闭全局模式:删除
tsconfig.json中types数组里的"vitest/globals",保持显式导入的方式
2. 补充Vitest配置中的全局模式开关
仅在tsconfig中添加类型不足以启用全局变量,必须在Vitest的配置文件(vitest.config.ts/vitest.config.js)中开启globals选项:
// vitest.config.ts import { defineConfig } from 'vitest/config' export default defineConfig({ test: { globals: true, // 其他测试配置(比如环境、覆盖率等)可按需添加 } })
3. 针对编译后JS测试的额外检查
如果你是测试dist目录下编译后的JavaScript文件,需要注意:
- 确保编译过程没有移除
vi相关的mock代码(比如开启Tree Shaking时要排除测试相关逻辑) - 测试文件中正确引入编译后的JS路径,避免路径错误
- 你的
tsconfig中module设为commonjs,需确保Vitest测试环境的模块格式与之匹配(可在Vitest配置中显式设置test.module: 'commonjs')
4. 验证依赖安装
确认已正确安装Vitest依赖:
npm install vitest --save-dev
如果依赖版本过旧,可能存在API兼容问题,建议升级到稳定版本。
内容的提问来源于stack exchange,提问作者rysloan
相关产品推荐
相关产品推荐

