已导入onTestFailed但TypeScript仍报其未定义的Vitest问题
解决Bun运行Vitest时
onTestFailed钩子报TypeError的问题 核心问题分析
你遇到的TypeError: onTestFailed is not a function本质是混淆了Bun自带测试器和Vitest的运行逻辑:bun test是Bun原生的测试命令,它不会加载Vitest的钩子系统,即便你写了Vitest的onTestFailed代码,Bun的测试运行器也无法识别这个API,自然会报错。但测试能执行是因为Bun仍会运行测试用例本身,只是忽略了Vitest的钩子逻辑。
解决方案步骤
1. 改用正确的命令启动Vitest测试
不要直接用bun test,而是用以下方式启动Vitest:
- 临时运行:
bunx vitest - 配置package.json脚本(推荐):
然后执行:{ "scripts": { "test": "vitest" } }bun run test
这样才能确保Vitest的完整生命周期(包括钩子)被加载执行。
2. 确认Vitest配置正确适配Bun环境
在vitest.config.ts中明确指定使用Bun作为运行时/环境:
import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { // 用Bun作为测试环境 environment: 'bun', // 或者指定Bun为测试运行器(根据Vitest版本选择,部分版本二选一即可) runner: 'bun', }, });
3. 修正TypeScript类型配置
将tsconfig.json的types字段补充完整,确保Vitest的类型被正确识别:
{ "compilerOptions": { "types": ["vitest", "vitest/globals"] } }
仅添加vitest/globals可能不足以覆盖所有Vitest API的类型定义。
4. 检查onTestFailed的导入方式
如果全局变量方式有问题,尝试显式导入Vitest API:
import { onTestFailed } from 'vitest'; onTestFailed((testResult) => { // 你的失败测试处理逻辑 console.log(`测试失败:${testResult.name}`, testResult.error); });
5. 版本兼容性排查
当前Bun 1.1.38和Vitest 2.1.8的组合可能存在兼容问题:
- 尝试升级Bun到最新稳定版(比如1.1.x后续版本)
- 或降级Vitest到2.0.x系列,该版本对Bun的兼容性经过更多验证
验证方法
修改配置和命令后,重新运行测试:
- 确认
onTestFailed钩子正常执行,不再报TypeError - 检查失败测试的额外信息是否按预期输出
内容的提问来源于stack exchange,提问作者AbcAeffchen
相关产品推荐
相关产品推荐

