Skip to content

在许多情况下,Bun 的测试运行器无需更改代码即可运行 Jest 测试套件。只需运行 bun test 而不是 npx jestyarn test 等。

sh
npx jest
yarn test
bun test

通常无需更改代码。

  • Bun 内部重写从 @jest/globals 的导入以使用 bun:test 等效项。
  • 如果你依赖 Jest 将 testexpect 等作为全局变量注入,Bun 也会这样做。

但如果你更愿意切换到 bun:test 导入,也可以这样做。

ts
import { test, expect } from "@jest/globals"; 
import { test, expect } from "bun:test"; 

自 Bun v1.2.19 起,你可以使用单个三斜杠指令为全局测试函数启用 TypeScript 支持。这使得从 Jest 迁移变得更加容易,因为你只需在整个项目中添加一次指令:

将此指令添加到项目中的一个文件,例如:

  • 项目根目录中的 global.d.ts 文件
  • 测试 preload.ts 设置文件(如果在 bunfig.toml 中使用 preload
  • TypeScript 包含在编译中的任何单个 .ts 文件
ts
/// <reference types="bun-types/test-globals" />

添加后,项目中所有测试文件自动为 Jest 全局变量获得 TypeScript 支持:

ts
describe("我的测试套件", () => {
  test("应该工作", () => {
    expect(1 + 1).toBe(2);
  });

  beforeAll(() => {
    // 设置代码
  });

  afterEach(() => {
    // 清理代码
  });
});

Bun 实现了绝大多数 Jest 匹配器,但兼容性尚未达到 100%。请参阅 文档 > 测试运行器 > 编写测试 的完整兼容性表。

一些值得注意的缺失功能:

  • expect().toHaveReturned()

如果你使用 testEnvironment: "jsdom" 在类似浏览器的环境中运行测试,你应该遵循 使用 Bun 和 happy-dom 进行 DOM 测试 指南将浏览器 API 注入到全局作用域。本指南依赖于 happy-dom,它是 jsdom 的更精简和更快的替代方案。

目前 jsdom 在 Bun 中无法工作,因为它内部使用了 V8 API。请在此跟踪支持情况

toml
[test]
preload = ["./happy-dom.ts"]

将 Jest 配置中的 bail 替换为 --bail CLI 标志。

sh
bun test --bail=3

collectCoverage 替换为 --coverage CLI 标志。

sh
bun test --coverage

testTimeout 替换为 --test-timeout CLI 标志。

sh
bun test --timeout 10000

许多其他标志在使用 bun test 时变得不相关或过时。

  • transform — Bun 支持 TypeScript 和 JSX。其他文件类型可以使用 插件 配置。
  • extensionsToTreatAsEsm
  • haste — Bun 使用自己的内部 source maps
  • watchmanwatchPluginswatchPathIgnorePatterns — 使用 --watch 以 watch 模式运行测试
  • verbose — 在 bunfig.toml 中设置 logLevel: "debug"

此处未提及的设置不受支持或没有等效项。如果缺少重要的内容,请提交功能请求


另请参阅:

Bun学习网由www.bunjs.com.cn整理维护