Skip to main content
Bun 的测试运行器与现有的组件和 DOM 测试库配合良好,包括 React Testing Library 和 happy-dom。

happy-dom

对于前端代码和组件的无头测试,我们推荐使用 happy-dom。它实现了纯 JavaScript 中完整的 HTML 和 DOM API 集合,因此可以高保真地模拟浏览器环境。 安装 @happy-dom/global-registrator 包作为开发依赖。
terminal
使用 Bun 的预加载功能在测试运行前注册 happy-dom 全局变量,这会使浏览器 API(如 document)在全局作用域中可用。在项目根目录创建一个名为 happydom.ts 的文件,包含以下代码:
happydom.ts
要在 bun test 之前预加载此文件,请打开或创建一个 bunfig.toml 文件并添加以下行。
bunfig.toml
现在 bun test 会在你的测试之前执行 happydom.ts,因此测试可以使用诸如 documentwindow 之类的浏览器 API。
dom.test.ts

TypeScript 支持

根据你的 tsconfig.json 设置,你可能会在上面代码中看到”Cannot find name ‘document‘“的类型错误。要加载 document 和其他浏览器 API 的类型,请在任何测试文件的顶部添加以下三斜杠指令。
dom.test.ts
使用 bun test 运行测试:
terminal

React Testing Library

Bun 可以与 React Testing Library 配合测试 React 组件。按照前述方法设置 happy-dom 后,正常安装和使用 React Testing Library。
terminal
component.test.tsx

高级 DOM 测试

自定义元素

使用相同的设置测试自定义元素和 Web 组件:
custom-element.test.ts

事件测试

测试 DOM 事件和用户交互:
events.test.ts

配置技巧

全局设置

对于更复杂的设置,创建一个也注册全局模拟的预加载文件:
test-setup.ts
然后更新你的 bunfig.toml
bunfig.toml

故障排除

常见问题

DOM API 的 TypeScript 错误:在测试文件顶部加上 /// <reference lib="dom" /> 指令。 缺少全局变量:检查你的预加载文件是否导入并注册了 @happy-dom/global-registrator React 组件渲染问题:检查是否安装了 @testing-library/react 并且 happy-dom 已设置。

性能考量

happy-dom 速度很快,但对于非常大的测试套件,你可能需要:
  • 使用 beforeEach 在测试之间重置 DOM 状态
  • 避免在单个测试中创建太多 DOM 元素
  • 使用测试库的 cleanup 函数
test-setup.ts