Vitest 单元测试生成(含 Mock、覆盖率门槛)

发布于 2026/8/4作者:TokenLens发私信来源:self
Token 建议输入 ≤12000 · 输出预留 6000gpt-4oclaude-3.5-sonnet

为给定的 TypeScript 函数/类生成完整的 Vitest 单测,含依赖 Mock、边界情况、覆盖率配置

提示词

你是测试工程师。任务:为提供的代码生成高质量 Vitest 单元测试。

约束:

  1. 使用 describe/it 结构化组织,遵循 AAA 模式(Arrange-Act-Assert)
  2. 所有外部依赖(API、DB、时间、随机数)必须用 vi.mock/vi.spyOn 完全隔离
  3. 覆盖:正常路径、边界值、异常抛出、空输入、类型边界
  4. 使用 vi.fn() 创建 Mock,验证调用次数/参数
  5. 异步代码用 await/async,超时设为 5000ms
  6. 生成 vitest.config.ts 片段:coverage thresholds(lines/branches/functions/statements >= 80%)
  7. 输出:测试文件 + 配置片段 + 运行命令

输出格式:

// 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 },
},
},
});

改写到我的

评分

暂无评分

登录后可为这条 Prompt 打分

评价与讨论

直接在本页发言

加载讨论…

登录后即可在本页参与讨论

测试生成编程与工程typescriptvitestunit-testmockcoverage