Happy DOM Tests 是一个面向 React 组件测试的写作技能。它的定位是让使用者以顶级软件工程师的测试能力来编写 React 组件渲染测试。触发方式为传入待测目标($ARGUMENTS),技能据此产出对应的测试代码。
一、用途 该技能用于编写 React 组件与自定义 Hook 的渲染测试(.test.tsx)。它为每个测试设定一个明确目标:让每个测试回答五个问题——被测组件是什么(测试应放在具名的 describe 块中)、预期行为是什么(通过 $given 与 $should 参数表达)、哪些 props 或 state 触发该行为(使用带默认值的工厂函数)、用户看到或交互的是什么(使用无障碍查询而非实现细节)、以及如何定位 bug(若前述问题回答正确则隐含得到答案)。
二、主要能力与约束 测试框架与文件:使用 Vitest 的 describe、expect、test;测试文件使用 .test.tsx 扩展名;测试文件与被测组件就近放置(colocate)。 测试命名:测试必须使用「given: ..., should: ...」的散文格式。 导入约定:从共享的 ~/test/react-test-utils 模块导入 render、screen、userEvent 和 createRoutesStub;该模块在 Testing Library 之上封装了应用级 provider(i18n、表单上下文等)。 Props 工厂:为每个组件创建一个 props 工厂函数并提供合理的默认值,每个测试只覆盖自身需要变化的部分。 路由上下文:使用 React Router 的 createRoutesStub 提供路由上下文,并通过 initialEntries 传入特定路由。 查询策略:以无障碍查询作为主要定位方式,包括 screen.getByRole、screen.getByLabel、screen.getByText。否定断言使用 screen.queryByRole(返回 null),而不要使用 getByRole 配合 not.toBeInTheDocument。文本匹配使用带不区分大小写标志的正则,如 { name: /submit/i }。 用户交互:使用 userEvent.setup(),不要使用 fireEvent。 Mock:使用 vi.fn() 作为 mock 回调,使用 vi.spyOn 处理全局 mock。 Hook 测试:使用 renderHook 与 act 测试自定义 Hook;对于依赖定时器的 Hook,使用 vi.useFakeTimers()。 测试数据:在工厂中使用 @faker-js/faker 与 cuid2 生成贴近真实的测试数据;当 props 来自数据库实体时,使用既有的基础设施工厂(*-factories.server.ts)。 Provider 包装:当组件需要额外 provider(例如 SidebarProvider)时,在 RouterStub 之外再包一层;当组件读取 loader 数据时,向 RouterStub 传入 hydrationData。 参数化:当多组输入产生相似结果时,使用 test.each 编写参数化测试。 断言范围:可断言无障碍属性(如 toHaveAttribute("aria-selected", "true")、toHaveAttribute("aria-current", "page"))、元素状态(toBeDisabled()、toBeEnabled()、toHaveFocus())、结构(toBeInTheDocument()、toHaveAttribute("href", "/path")、toHaveTextContent(/text/i));对于纯逻辑校验,先用变量捕获实际值与期望值,再使用 toEqual 断言。
三、使用方式 在需要编写 React 组件或 Hook 渲染测试时调用该技能,并传入待测目标。技能会按照上述约束生成 .test.tsx 测试文件。
四、适用场景与边界 该技能仅适用于 React 组件与 Hook 的渲染测试(.test.tsx)。不适用于:不含 React 的纯函数测试(.test.ts)应改用 /unit-tests;数据库或 server action 测试(.spec.ts)应改用 /integration-tests;浏览器级用户流程测试(.e2e.ts)应改用 /e2e-tests。
五、限制与暂未提供的信息 该技能基于 happy-dom 与 Testing Library,具体依赖版本、安装命令、配置示例、对非 React 框架的支持情况,以及任何收费或许可信息,官方资料均暂未提供。