O que você aprenderá neste tutorial
✓ Configuração do Vitest
✓ Criação de testes básicos
✓ Mocks
✓ Cobertura
✓ Modo UI
Step 1: Configuração
npm install -D vitest @testing-library/react @testing-library/jest-dom jsdom
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom',
globals: true,
setupFiles: './src/test/setup.ts',
},
});
// src/test/setup.ts
import '@testing-library/jest-dom';
Step 2: Testes básicos
// src/utils/math.ts
export function add(a: number, b: number) {
return a + b;
}
// src/utils/math.test.ts
import { describe, it, expect } from 'vitest';
import { add } from './math';
describe('add', () => {
it('should add two numbers', () => {
expect(add(1, 2)).toBe(3);
});
it('should handle negative numbers', () => {
expect(add(-1, 1)).toBe(0);
});
});
Step 3: Testes de componentes
// src/components/Button.tsx
interface Props {
onClick: () => void;
children: React.ReactNode;
}
export function Button({ onClick, children }: Props) {
return <button onClick={onClick}>{children}</button>;
}
// src/components/Button.test.tsx
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { describe, it, expect, vi } from 'vitest';
import { Button } from './Button';
describe('Button', () => {
it('renders children', () => {
render(<Button onClick={() => {}}>Click me</Button>);
expect(screen.getByText('Click me')).toBeInTheDocument();
});
it('calls onClick when clicked', async () => {
const handleClick = vi.fn();
render(<Button onClick={handleClick}>Click me</Button>);
await userEvent.click(screen.getByRole('button'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
});
Step 4: Mocks
// Mock de módulo
vi.mock('./api', () => ({
fetchUser: vi.fn().mockResolvedValue({ id: 1, name: 'Test' }),
}));
// Mock de função
const mockFn = vi.fn();
mockFn.mockReturnValue(42);
mockFn.mockResolvedValue({ data: 'test' });
// Spy
const spy = vi.spyOn(console, 'log');
console.log('test');
expect(spy).toHaveBeenCalledWith('test');
Step 5: Testes assíncronos
import { describe, it, expect, vi } from 'vitest';
describe('async tests', () => {
it('handles async operations', async () => {
const result = await fetchData();
expect(result).toBeDefined();
});
it('handles promises', () => {
return expect(asyncFn()).resolves.toBe('value');
});
it('handles rejections', () => {
return expect(failingFn()).rejects.toThrow('error');
});
});
Step 6: Execução de testes
# Executar testes
npm run test
# Modo watch
npm run test -- --watch
# Modo UI
npm run test -- --ui
# Cobertura
npm run test -- --coverage
Step 7: Scripts do package.json
{
"scripts": {
"test": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest --coverage"
}
}
Resumo
Vitest é um framework de testes rápido integrado ao Vite. Com API compatível com Jest, a migração é suave, e o modo UI permite debug eficiente.
← Voltar para a lista