Vitest - тест-раннер на основі Vite: використовує ту саму конфігурацію (псевдоніми, плагіни, TypeScript, JSX), що й застосунок, тож окремо налаштовувати Babel чи трансформації не треба. API сумісний з Jest (describe, test, expect, vi.fn).
Встановлення:
npm i -D vitest jsdom @testing-library/react @testing-library/dom @testing-library/user-event @testing-library/jest-dom
@testing-library/dom - обов'язкова залежність, яку з версії 16 React Testing Library треба ставити явно.
Конфігурація:
// vite.config.ts (або vitest.config.ts)
export default defineConfig({
plugins: [react()],
test: {
environment: 'jsdom', // DOM для компонентів у Node.js
globals: true, // describe/test/expect без імпорту
setupFiles: ['./src/test/setup.ts'],
},
});
// src/test/setup.ts
import '@testing-library/jest-dom/vitest'; // toBeInTheDocument, toHaveTextContent...
jsdom - реалізація DOM на JavaScript: є document, події, форми. Немає реальної розкладки (getBoundingClientRect повертає нулі), IntersectionObserver, matchMedia - їх доводиться підміняти. Альтернатива - happy-dom (швидша, менш повна).
Очищення між тестами: React Testing Library автоматично демонтує компоненти після кожного тесту, якщо раннер має глобальний afterEach (з globals: true). Без глобальних функцій потрібен ручний afterEach(cleanup).
Мінімальний тест:
import { render, screen } from '@testing-library/react';
test('показує привітання', () => {
render(<Greeting name="Оля" />);
expect(screen.getByRole('heading')).toHaveTextContent('Привіт, Оля');
});
Корисні налаштування:
TypeScript: додати"types": ["vitest/globals", "@testing-library/jest-dom"]уtsconfig, щоб редактор знав глобальні функції й матчери;test.css: false(за замовчуванням CSS не обробляється) - тести не залежать від стилів;vitest --ui- зручний інтерфейс у браузері,vitest --coverage- покриття.
Jest працює з тими самими бібліотеками, але потребує окремого налаштування трансформацій (Babel чи ts-jest) і модулів - у проєктах на Vite Vitest простіший.
Докладніше в документації: React Testing Library: налаштування