单元测试
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @kunlungrowth/vitest-unit
技能介绍
单元测试到底难在哪
写测试的人经常遇到三种困境:一是函数和组件耦合太深,想测一个纯逻辑却要连带 localStorage、fetch 和一整套组件树;二是 mock 范围失控,vi.mock() 把整个模块替换掉之后,测试通过但真实行为没人验证;三是覆盖率数字很好看,branches 却只有 40%,回归照样悄悄溜进来。
这个技能把 Vitest 的测试编写整理成一套可执行的工作流,目标是产出可读、可维护、能防回归的测试代码,而不是一堆只证明「代码没崩」的断言。
核心能力与关键步骤
- 范围识别:区分纯函数、React/Vue 组件与异步逻辑,各自匹配不同的断言策略,且只测公开接口与用户可见行为,不去碰
private方法或内部 state。 - 结构约束:统一采用 Arrange → Act → Assert 模式,用
describe分组,用it.each做参数化覆盖正常值、边界值与异常值。 - 分层 mock:按优先级依次考虑不 mock、
vi.fn()、vi.spyOn()、vi.mock()、MSW。优先测试运行时行为而不是替换实现,避免过度 mock。 - 覆盖率落地:在
vitest.config.ts里配置include/exclude与thresholds,建议statements80%、branches70%,配合vitest run --coverage让 CI 在不达标时直接失败。
适用边界
不适用于端到端流程验证(交给 playwright-e2e)或接口契约校验(交给 testing-api-contract)。如果你发现某个函数很难写出测试,通常说明模块耦合有问题,技能会同时给出重构方向而不是强行补 mock。已有测试代码也可以作为输入,用于质量审查。
使用场景
- 你刚写完一个 React 组件,需要补充测试覆盖用户交互和 props 变化,但不确定该测哪些行为而非实现细节
- 项目覆盖率报告显示 branches 只有 40%,你需要在 vitest.config.ts 里配置阈值,让 CI 在不达标时直接失败
- 某个函数依赖 fetch 和 localStorage,你想隔离测试纯逻辑部分,但不知道 mock 到什么程度才不会过度
- 团队决定从 Jest 迁移到 Vitest,你需要重写现有测试并验证兼容性,同时保持测试行为不变
适合人员
- 前端工程师:需要为新写的组件和函数编写可维护的单元测试,覆盖正常值、边界值和异常情况
- 测试工程师:需要在复杂依赖环境下 mock API 调用和第三方库,确保测试隔离且不侵入业务代码
- 技术负责人:需要将现有项目从 Jest 迁移到 Vitest,同时配置覆盖率阈值并接入 CI 流程
- 重构推动者:遇到测试难以编写的代码时,需要识别耦合问题并给出具体的重构建议