工程级参考答案(带完整注释):
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
// 被测试的函数(更复杂的版本)
class DiscountCalculator {
private history: Array<{ price: number; discount: number; result: number }> = [];
calculate(price: number, discountPercent: number): number {
if (!this.validate(price, discountPercent)) {
throw new Error('Invalid input');
}
const result = price * (1 - discountPercent / 100);
this.history.push({ price, discount: discountPercent, result });
return result;
}
private validate(price: number, discountPercent: number): boolean {
return price >= 0 && discountPercent >= 0 && discountPercent <= 100;
}
getHistory() {
return [...this.history];
}
clearHistory() {
this.history = [];
}
}
describe('DiscountCalculator', () => {
let calculator: DiscountCalculator;
beforeEach(() => {
calculator = new DiscountCalculator();
});
afterEach(() => {
calculator.clearHistory();
});
describe('calculate', () => {
it('正常情况:10元商品打 20% 折 = 8元', () => {
expect(calculator.calculate(10, 20)).toBe(8);
});
it('多次调用应该记录历史', () => {
calculator.calculate(10, 10);
calculator.calculate(20, 50);
expect(calculator.getHistory()).toHaveLength(2);
});
it('错误:负价格', () => {
expect(() => calculator.calculate(-10, 20)).toThrow('Invalid input');
});
});
});