前端开发
用 Vitest 测试 next-safe-action…
为 next-safe-action 的 server action、bind args、middleware、hooks 及校验错误编写 Vitest 测试。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 Vitest 测试 next-saf特定
解决思路
- 直接调用 server action 异步函数进行测试:断言 result.data、result.serverError、result.validationErrors 是否符合预期。
- 测试无效输入时断言 result.data 为 undefined、result.validationErrors 已定义,并通过 result.validationErrors?.email?._errors 检查具体错误信息。
- 测试重复邮箱等业务错误时,根据实现方式分别断言:使用 returnValidationErrors 时检查 validationErrors 字段;使用 throw + handleServerError 时检查 result.serverError 字符串;使用 returnServerError 时断言 result.serverError 等于精确的类型化 payload(如 { code: "DUPLICATE_EMAIL", message: "Email already in use" })。
- 测试 bind args 时用 updatePost.bind(null, postId) 生成绑定后的 action 再调用,断言 result.data;对无效 bind args(如非 UUID)用 await expect(...).rejects.toThrow() 断言抛出 ActionBindArgsValidationError。
- 测试 middleware 时用 createSafeActionClient().use(...) 构造带特定中间件链的 action,并用 vi.mock 模拟依赖(如 @/lib/auth 的 getSession),分别断言已认证时 ctx 正确传递、未认证时 result.serverError 已定义。
- 测试 hooks 时使用 @testing-library/react 的 renderHook 与 act、waitFor,并用 vi.fn() 模拟 action。
- 断言 hook 初始状态:result.current.isIdle 为 true、isExecuting 为 false、result 等于 {}。
- 在 act 中调用 result.current.execute(...),用 waitFor 等待 hasSucceeded 为 true,再断言 result.current.result.data。
- 测试 hook 错误处理:让 mockAction 返回 { serverError: "..." },用 waitFor 等待 hasErrored 为 true,断言 result.current.result.serverError 并验证 onError 回调被调用。
- 测试 hook 重置:执行成功后调用 result.current.reset(),断言 isIdle 为 true 且 result 等于 {}。
- 测试校验错误工具:用 flattenValidationErrors 断言 formErrors 与 fieldErrors 的内容,并断言 formatValidationErrors 为恒等函数(返回值与输入相同)。
- 模拟框架错误:用 vi.mock("next/navigation") 让 redirect 抛出带 digest 为 NEXT_REDIRECT;push;${url};303; 的错误,让 notFound 抛出 digest 为 NEXT_HTTP_ERROR_FALLBACK;404 的错误(注意 digest 格式为 Next.js 内部实现,可能随版本变化)。
- 按项目约定组织测试文件,如 happy-path.test.ts、validation-errors.test.ts、middleware.test.ts、navigation-errors.test.ts、server-error.test.ts、bind-args-validation-errors.test.ts、returnvalidationerrors.test.ts、input-schema.test.ts、metadata.test.ts、action-callbacks.test.ts、hooks-utils.test.ts。
- 运行测试:全部用 pnpm run test:lib;单个文件用 cd packages/next-safe-action && npx vitest run ./src/__tests__/action-builder.test.ts。