happy-dom
对于前端代码和组件的无头测试,我们推荐使用 happy-dom。它使用纯 JavaScript 实现了完整的 HTML 和 DOM API 集合,因此可以高度还原地模拟浏览器环境。 将@happy-dom/global-registrator 软件包作为开发依赖项安装。
terminal
document 等浏览器 API 就可以在全局作用域中使用。在项目根目录中创建名为 happydom.ts 的文件,并添加以下代码:
happydom.ts
bun test 之前预加载此文件,请打开或创建 bunfig.toml 文件,并添加以下内容:
bunfig.toml
bun test 现在会在测试之前执行 happydom.ts,因此测试可以使用 document 和 window 等浏览器 API。
dom.test.ts
TypeScript 支持
根据你的tsconfig.json 配置,你可能会在上面的代码中看到 "Cannot find name 'document'" 类型错误。要加载 document 和其他浏览器 API 的类型,请将以下三斜线指令添加到任意测试文件的顶部。
dom.test.ts
bun test 运行测试:
terminal
React 测试库
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" /> 指令。
缺少全局变量:检查 preload 文件是否导入并注册了 @happy-dom/global-registrator。
React 组件渲染问题:检查是否已安装 @testing-library/react,并确认 happy-dom 已完成设置。
性能考虑
happy-dom 速度很快,但对于非常大型的测试套件,你可能需要:- 使用
beforeEach在测试之间重置 DOM 状态 - 避免在单个测试中创建过多 DOM 元素
- 使用测试库提供的
cleanup函数
test-setup.ts