vitest-skill — скилл для Claude Code: что делает и как установить
Генерирует юнит-тесты на Vitest для JavaScript и TypeScript проектов. Помогает настроить моки через vi и протестировать компоненты React.
npx skills add LambdaTest/agent-skills --skill vitest-skill -a claude-codeЧто делает vitest-skill
Скилл задаёт правила генерации тестов под Vitest для JavaScript и TypeScript. Агент ориентируется на ESM и вызовы через объект vi (vi.fn(), vi.mock(), vi.spyOn()), а также таймеры vi.useFakeTimers(). Если проект мигрирует с Jest, скилл сразу пресекает вызовы jest.fn() и заставляет агента писать vi.fn().
Внутри собраны готовые шаблоны для проверки компонентов React через @testing-library/react и тестов прямо в исходном коде через import.meta.vitest. Также приведён рабочий пример vitest.config.ts с окружением jsdom и провайдером покрытия v8.
Какие задачи решает
- перевести моки с Jest на API
vi.mockиvi.fn - настроить конфигурацию
vitest.config.tsпод jsdom и v8 - написать тесты React-компонентов с
@testing-library/react - организовать in-source тестирование через
import.meta.vitest
Примеры запросов агенту
- Напиши юнит-тесты на Vitest для Calculator с проверкой деления на ноль
- Сделай мок модуля базы данных через vi.mock и vi.fn
- Создай конфигурационный файл vitest.config.ts для окружения jsdom
Как установить vitest-skill
1Через Skills CLI (Vercel)
npx skills add LambdaTest/agent-skills --skill vitest-skill -a claude-code2Вручную: положить файлы
~/.claude/skills/vitest-skill/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/vitest-skill/
1Через Skills CLI (Vercel)
npx skills add LambdaTest/agent-skills --skill vitest-skill -a codex2Вручную: положить файлы
.agents/skills/vitest-skill/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add LambdaTest/agent-skills --skill vitest-skill -a cursor2Вручную: положить файлы
.cursor/skills/vitest-skill/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install LambdaTest/agent-skills vitest-skill2Вручную: положить файлы
.github/skills/vitest-skill/SKILL.md1Через Skills CLI (Vercel)
npx skills add LambdaTest/agent-skills --skill vitest-skill -a gemini-cli2Командой платформы
gemini skills install https://github.com/LambdaTest/agent-skills --path vitest-skillВручную: положить файлы
.devin/skills/vitest-skill/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add LambdaTest/agent-skills --skill vitest-skill -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о vitest-skill
Как установить vitest-skill в Claude Code?
Выполните команду npx skills add LambdaTest/agent-skills --skill vitest-skill -a claude-code в терминале.
Что делает vitest-skill?
Скилл обучает ассистента генерировать тесты под Vitest с нативным ESM, моками vi, снепшотами и поддержкой React.
Чем моки в этом скилле отличаются от Jest?
Скилл запрещает методы jest.fn() и jest.mock(), заменяя их на вызовы vi.fn(), vi.mock() и vi.spyOn().
Исходный текст
SKILL.md · MIT
---
name: vitest-skill
description: >
Generates Vitest tests in JavaScript/TypeScript with Vite-native speed.
Jest-compatible API with ESM support and HMR. Use when user mentions "Vitest",
"vi.mock", "vitest.config". Triggers on: "Vitest", "vi.mock", "vi.fn",
"Vite test", "vitest config".
languages:
- JavaScript
- TypeScript
category: unit-testing
license: MIT
metadata:
author: TestMu AI
version: "1.0"
---
# Vitest Testing Skill
## Core Patterns
### Basic Test
```typescript
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();
});
});
```
### Mocking (vi instead of jest)
```typescript
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();
```
### In-Source Testing
```typescript
// 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); });
}
```
### Snapshot Testing
```typescript
it('serializes user', () => {
expect(serializeUser(user)).toMatchSnapshot();
});
it('inline snapshot', () => {
expect(serializeUser(user)).toMatchInlineSnapshot(`
{ "name": "Alice", "email": "[email protected]" }
`);
});
```
### React Component Testing
```typescript
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();
});
});
```
### Anti-Patterns
| Bad | Good | Why |
|-----|------|-----|
| `jest.fn()` | `vi.fn()` | Vitest uses `vi` |
| `jest.mock()` | `vi.mock()` | Different namespace |
| No type safety | TypeScript + strict | Vitest is TS-first |
## Quick Reference
| Task | Command |
|------|---------|
| Run once | `npx vitest run` |
| Watch | `npx vitest` (default) |
| UI | `npx vitest --ui` |
| Coverage | `npx vitest --coverage` |
| Specific file | `npx vitest run src/math.test.ts` |
| Filter | `npx vitest run -t "adds"` |
## vitest.config.ts
```typescript
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}'],
},
});
```
## Deep Patterns → `reference/playbook.md`
| § | Section | Lines |
|---|---------|-------|
| 1 | Production Configuration | Config, workspace, setup file |
| 2 | Mocking Patterns | vi.mock, spies, timers, fetch |
| 3 | React Testing Library | Components, hooks, providers |
| 4 | Snapshot & Inline Snapshots | File, inline, serializers |
| 5 | Table-Driven Tests | test.each, describe.each |
| 6 | In-Source Testing | Co-located tests in source |
| 7 | API / Integration Testing | Server tests with fetch |
| 8 | CI/CD Integration | GitHub Actions, scripts |
| 9 | Debugging Quick-Reference | 10 common problems |
| 10 | Best Practices Checklist | 13 items |
© TestMu AI · MIT · LambdaTest/agent-skills