研发协作
用 Jest/Vitest + Testing…
在编写 JavaScript/TypeScript 测试、搭建测试基础设施或实践 TDD/BDD 时,提供从框架配置到 mock、fixture 的完整可执行做法。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 Jest/Vitest + Test通用
解决思路
- 配置 Jest:在 jest.config.ts 中设置 preset 为 ts-jest、testEnvironment 为 node、roots 为 <rootDir>/src、testMatch 匹配 **/__tests__/**/*.ts 与 **/?(*.)+(spec|test).ts,用 collectCoverageFrom 收集 src/**/*.ts 并排除 .d.ts 与 .interface.ts,coverageThreshold 全局设为 branches/functions/lines/statements 各 80,setupFilesAfterEnv 指向 <rootDir>/src/test/setup.ts。
- 配置 Vitest:在 vitest.config.ts 中设置 globals 为 true、environment 为 node,coverage.provider 用 v8、reporter 用 text/json/html 并排除 **/*.d.ts、**/*.config.ts、**/dist/**,setupFiles 指向 ./src/test/setup.ts。
- 测试纯函数:用 describe 分组、it 描述行为,用 expect(...).toBe(...) 断言正常值、边界值(如 0、负数、小数),用 expect(() => fn()).toThrow('...') 断言抛错(如除零)。
- 测试类:在 beforeEach 中实例化被测类以保证隔离;覆盖 create 成功与重复创建抛错、update 成功与目标不存在抛错、findById、delete 等分支,用 toEqual 做对象整体比较。
- 测试异步函数:用 global.fetch = vi.fn() 替换全局 fetch,在 beforeEach 中调用 vi.clearAllMocks();用 mockResolvedValueOnce 模拟 { ok: true, json: async () => data } 或 { ok: false };用 await expect(...).rejects.toThrow(...) 断言异步错误,并用 toHaveBeenCalledWith 校验请求 URL 与 method/body。
- Mock 模块:用 vi.mock('nodemailer', () => ({ default: { createTransport: vi.fn(() => ({ sendMail: vi.fn().mockResolvedValue({ messageId: '123' }) })) } })) 替换第三方依赖,再断言 sendMail 被调用时的参数。
- 用依赖注入便于测试:为服务定义接口(如 IUserRepository),构造函数注入依赖;测试时用 { findById: vi.fn(), create: vi.fn() } 构造 mock 仓库,用 vi.mocked(...).mockResolvedValue(...) 设定返回值并断言调用参数。
- 用 spy 监控函数:用 vi.spyOn(logger, 'info') 监听调用,断言 toHaveBeenCalledWith 与 toHaveBeenCalledTimes,并在 afterEach 中调用 mockRestore() 还原。
- 集成测试:用 supertest 测试真实 HTTP 端点、连接测试数据库,在 beforeEach 中清空(truncate)所有表,在 afterAll 中拆除资源;完整示例见 references/advanced-testing-patterns.md。
- 前端组件测试:用 Testing Library 渲染 React 组件,优先用 getByRole、getByPlaceholderText 等语义查询,谨慎使用 data-testid;用 renderHook + act 测试 hooks;完整示例见 references/advanced-testing-patterns.md。
- 用 @faker-js/faker 构建测试数据工厂:工厂函数接受可选 overrides 参数,用 faker.string.uuid()、faker.person.fullName()、faker.internet.email()、faker.date.past() 生成真实感数据,再展开 ...overrides 让测试只覆盖关心的字段。
- 遵循最佳实践:按 AAA(Arrange、Act、Assert)组织测试;每个测试一个或逻辑相关的一组断言;测试名描述被测行为;用 beforeEach/afterEach 做 setup/teardown;mock 外部依赖保持隔离;覆盖边界与错误路径而非只测 happy path;测行为不测实现细节;用工厂保证数据一致;mock 慢操作保持测试快速;尽量先写测试(TDD);覆盖率目标 80%+;用 TypeScript 写类型安全测试;测试后清理避免污染。
- 快照测试、覆盖率配置、测试组织、Promise 测试与定时器 mock 等进阶做法见 references/advanced-testing-patterns.md。
适用边界 · 注意事项
- 项目不使用 JavaScript/TypeScript 技术栈时
- 只需要手工验证、不打算引入自动化测试框架或 CI 时