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

已导入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的兼容性经过更多验证

验证方法

修改配置和命令后,重新运行测试:

  1. 确认onTestFailed钩子正常执行,不再报TypeError
  2. 检查失败测试的额外信息是否按预期输出

内容的提问来源于stack exchange,提问作者AbcAeffchen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:13:18