关于 vitest-skill
vitest-skill 面向使用 Vitest 编写测试的开发者,提供模拟、快照、React 组件和源码内测试的示例,并涵盖配置与常用命令。
主要功能
- 01使用 Vitest API 编写测试
- 02用 vi 模拟模块
- 03使用快照和内联快照
- 04测试 React 组件
- 05配置源码内测试与覆盖率
适用场景
- 01为 TypeScript 代码编写单元测试
- 02在测试中模拟数据库调用
- 03测试 React 组件和序列化结果
- 04以监听或覆盖率模式运行测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lambdatest/ agent-skills --skill vitest-skill安装后在 Claude Code 中输入/vitest-skill确认已加载。
附带文件reference/advanced-patterns.mdreference/playbook.md
详细介绍
Vitest 测试技能
核心模式
基本测试
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { Calculator } from './calculator';
describe('Calculator', () => {
let calc: Calculator;
beforeEach(() => { calc = new Calculator(); });
it('adds two numbers', () => {
expect(calc.add(2, 3)).toBe(5);
});
it('throws on divide by zero', () => {
expect(() => calc.divide(10, 0)).toThrow();
});
});
模拟(使用 vi 而非 jest)
import { vi } from 'vitest';
// Mock module
vi.mock('./database', () => ({
getUser: vi.fn().mockResolvedValue({ name: 'Alice' }),
saveUser: vi.fn().mockResolvedValue(true),
}));
// Mock function
const mockFn = vi.fn();
mockFn.mockReturnValue(42);
mockFn.mockResolvedValue({ data: 'test' });
// Spy
const spy = vi.spyOn(console, 'log').mockImplementation(() => {});
expect(spy).toHaveBeenCalledWith('message');
spy.mockRestore();
// Timers
vi.useFakeTimers();
vi.advanceTimersByTime(1000);
vi.runAllTimers();
vi.useRealTimers();
源码内测试
// src/math.ts — tests alongside code!
export function add(a: number, b: number) { return a + b; }
export function multiply(a: number, b: number) { return a * b; }
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest;
it('adds', () => { expect(add(2, 3)).toBe(5); });
it('multiplies', () => { expect(multiply(3, 4)).toBe(12); });
}
快照测试
it('serializes user', () => {
expect(serializeUser(user)).toMatchSnapshot();
});
it('inline snapshot', () => {
expect(serializeUser(user)).toMatchInlineSnapshot(`
{ "name": "Alice", "email": "[email protected]" }
`);
});
React 组件测试
import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import Button from './Button';
describe('Button', () => {
it('renders with label', () => {
render(<Button label="Click me" />);
expect(screen.getByText('Click me')).toBeDefined();
});
});
反模式
| 不推荐 | 推荐 | 原因 |
|---|---|---|
jest.fn() | vi.fn() | Vitest 使用 vi |
jest.mock() | vi.mock() | 命名空间不同 |
| 没有类型安全 | TypeScript + strict | Vitest 以 TypeScript 为先 |
快速参考
| 任务 | 命令 |
|---|---|
| 运行一次 | npx vitest run |
| 监听模式 | npx vitest(默认) |
| UI | npx vitest --ui |
| 覆盖率 | npx vitest --coverage |
| 指定文件 | npx vitest run src/math.test.ts |
| 筛选 | npx vitest run -t "adds" |
vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'jsdom',
coverage: { provider: 'v8', reporter: ['text', 'html'] },
include: ['src/**/*.{test,spec}.{js,ts,tsx}'],
includeSource: ['src/**/*.{js,ts}'],
},
});
深入模式 → reference/playbook.md
| § | 章节 | 内容 |
|---|---|---|
| 1 | 生产环境配置 | 配置、工作区、设置文件 |
| 2 | 模拟模式 | vi.mock、间谍、计时器、fetch |
| 3 | React Testing Library | 组件、钩子、提供者 |
| 4 | 快照与内联快照 | 文件、内联、序列化器 |
| 5 | 表格驱动测试 | test.each、describe.each |
| 6 | 源码内测试 | 与源码同置的测试 |
| 7 | API / 集成测试 | 使用 fetch 进行服务端测试 |
| 8 | CI/CD 集成 | GitHub Actions、脚本 |
| 9 | 调试快速参考 | 10 个常见问题 |
| 10 | 最佳实践检查清单 | 13 项 |
评论
支持 Markdown