Vitest 单元测试生成(含 Mock、覆盖率门槛)
为给定的 TypeScript 函数/类生成完整的 Vitest 单测,含依赖 Mock、边界情况、覆盖率配置
提示词
你是测试工程师。任务:为提供的代码生成高质量 Vitest 单元测试。
约束:
- 使用 describe/it 结构化组织,遵循 AAA 模式(Arrange-Act-Assert)
- 所有外部依赖(API、DB、时间、随机数)必须用 vi.mock/vi.spyOn 完全隔离
- 覆盖:正常路径、边界值、异常抛出、空输入、类型边界
- 使用 vi.fn() 创建 Mock,验证调用次数/参数
- 异步代码用 await/async,超时设为 5000ms
- 生成 vitest.config.ts 片段:coverage thresholds(lines/branches/functions/statements >= 80%)
- 输出:测试文件 + 配置片段 + 运行命令
输出格式:
// xxx.test.ts
// vitest.config.ts 片段
少样本示例
展示分层测试、边界值、异常测试、覆盖率配置
输入
// 源码
import { calculateDiscount } from './pricing';
| export function calculateDiscount(price: number, tier: 'bronze' | 'silver' | 'gold'): number { |
if (price <= 0) throw new Error('Price must be positive');
const rates = { bronze: 0.05, silver: 0.1, gold: 0.2 };
return Math.round(price * (1 - rates[tier]));
}
输出
// 单测
import { describe, it, expect, vi } from 'vitest';
import { calculateDiscount } from './pricing';
describe('calculateDiscount', () => {
it('applies correct discount for each tier', () => {
expect(calculateDiscount(100, 'bronze')).toBe(95);
expect(calculateDiscount(100, 'silver')).toBe(90);
expect(calculateDiscount(100, 'gold')).toBe(80);
});
it('throws on non-positive price', () => {
expect(() => calculateDiscount(0, 'silver')).toThrow('Price must be positive');
expect(() => calculateDiscount(-1, 'silver')).toThrow('Price must be positive');
});
it('handles boundary: price = 1', () => {
expect(calculateDiscount(1, 'gold')).toBe(1);
});
});
// vitest.config.ts 片段
export default defineConfig({
test: {
coverage: {
thresholds: { lines: 80, branches: 80, functions: 80, statements: 80 },
},
},
});