vitest-skill
Skill387 starsChanged 3 days agoMITView on GitHub
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".
Files
Vitest Testing Skill
Core Patterns
Basic Test
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)
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
// 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
it('serializes user', () => {
expect(serializeUser(user)).toMatchSnapshot();
});
it('inline snapshot', () => {
expect(serializeUser(user)).toMatchInlineSnapshot(`
{ "name": "Alice", "email": "alice@test.com" }
`);
});React Component Testing
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
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 |
Other versions3 projects use a version of this.
Word for word · 1
- noahsilve123/claude-skillset★ 1100% same
Edited · 2
- Adhamxon/claude-code-skills★ 280% same
- Bot2353/skills★ 092% same
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository49 other files it gives its agents.
- accessibility-skillSkill
- appium-skillSkill
- behat-skillSkill
- behave-skillSkill
- capybara-skillSkill
- cicd-pipeline-skillSkill
- codeception-skillSkill
- cucumber-skillSkill
- cypress-skillSkill
- detox-skillSkill
- espresso-skillSkill
- flutter-testing-skillSkill
- gauge-skillSkill
- geb-skillSkill
- hyperexecute-skillSkill
- jasmine-skillSkill
- jest-skillSkill
- junit-5-skillSkill
- kanecli-skillSkill
- karma-skillSkill
- laravel-dusk-skillSkill
- lettuce-skillSkill
- mocha-skillSkill
- mstest-skillSkill
- nemojs-skillSkill
- nightwatchjs-skillSkill
- nunit-skillSkill
- phpunit-skillSkill
- playwright-skillSkill
- protractor-skillSkill
- puppeteer-skillSkill
- pytest-skillSkill
- reqnroll-skillSkill
- robot-framework-skillSkill
- rook-skillSkill
- rspec-skillSkill
- selenide-skillSkill
- selenium-skillSkill
- serenity-bdd-skillSkill
- smartui-skillSkill
- specflow-skillSkill
- testcafe-skillSkill
- test-framework-migration-skillSkill
- testng-skillSkill
- testunit-skillSkill
- unittest-skillSkill
- webdriverio-skillSkill
- xcuitest-skillSkill
- xunit-skillSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

