You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对编译后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:26:12