运行测试
单元测试
单元测试位于__tests__/ 目录下,使用 Vitest 并配合 jsdom 运行。
编写策略单元测试
端到端测试
E2E 测试将真实的failproofai 二进制文件作为子进程调用,将 JSON 载荷通过 stdin 传入,并对 stdout 输出和退出码进行断言。这覆盖了 Claude Code 使用的完整集成路径。
配置
E2E 测试直接从仓库源码运行二进制文件。在首次运行前,需要构建自定义 hook 文件在导入'failproofai' 时所使用的 CJS 包:
src/hooks/custom-hooks-registry.ts、src/hooks/policy-helpers.ts 或 src/hooks/policy-types.ts)时,需要重新构建 dist/。
E2E 测试结构
使用 E2E 辅助工具
FixtureEnv —— 每个测试的隔离环境:
createFixtureEnv() 会自动注册 afterEach 清理逻辑。
runHook —— 调用二进制文件:
Payloads —— 预置载荷工厂函数:
编写 E2E 测试
E2E 响应结构
Vitest 配置
E2E 测试使用vitest.config.e2e.mts,配置如下:
environment: "node"—— 不需要浏览器全局变量pool: "forks"—— 真正的进程隔离(测试会启动子进程)testTimeout: 20_000—— 每个测试超时 20 秒(含二进制启动 + hook 求值时间)
forks 池非常重要:基于线程的 worker 会共享 globalThis,可能干扰启动子进程的测试。基于进程的 forks 可避免此问题。
CI
在合并代码前,必须通过完整的 CI 流程(bun run lint && bunx tsc --noEmit && bun run test:run && bun run build)。E2E 测试套件作为独立的 CI 任务并行运行。
完整的合并前检查清单请参阅 Contributing。
