Налаштування Jest та React Testing Library: покроковий посібник для React та Next.js проектів
Тестування — це важлива частина життєвого циклу будь-якого застосунку. У світі React і Next.js найпопулярнішими інструментами для цього є Jest і React Testing Library. Цей гайд допоможе вам налаштувати тестове середовище швидко, правильно і з урахуванням кращих практик.
Чому саме Jest і React Testing Library?
- Jest — це фреймворк для тестування, який ідеально підходить для проектів на JavaScript/TypeScript. Має вбудований тест-раннер, мокінг, покриття та підтримку таймерів.
- React Testing Library (RTL) — зосереджена на тестуванні поведінки користувача, а не реалізації компонентів. Це підхід, близький до реального використання.
Підготовка проекту
Для Create React App (CRA)
CRA має Jest і RTL з коробки. Але якщо у вас Next.js, потрібно налаштовувати вручну.
Для Next.js проекту
- Встановлюємо залежності:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom babel-jest identity-obj-proxy @testing-library/user-event
- Додаємо конфігураційний файл
jest.config.js
:
const nextJest = require('next/jest');
const createJestConfig = nextJest({ dir: './' });
const customJestConfig = {
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
'\\.(css|less|scss|sass)$': 'identity-obj-proxy',
},
testEnvironment: 'jsdom',
};
module.exports = createJestConfig(customJestConfig);
- Створюємо файл
jest.setup.js
:
import '@testing-library/jest-dom';
- (Необов’язково) Якщо використовуєте TypeScript, додайте типи у
tsconfig.json
:
{
"compilerOptions": {
"types": ["jest", "@testing-library/jest-dom"]
}
}
Написання першого тесту
Компонент (наприклад Button.jsx
):
export default function Button({ onClick, children }) {
return <button onClick={onClick}>{children}</button>;
}
Тест (Button.test.jsx
):
import { render, screen, fireEvent } from '@testing-library/react';
import Button from './Button';
test('натискає кнопку', () => {
const handleClick = jest.fn();
render(<Button onClick={handleClick}>Натисни мене</Button>);
const button = screen.getByText('Натисни мене');
fireEvent.click(button);
expect(handleClick).toHaveBeenCalledTimes(1);
});
Корисні поради
- Використовуйте
userEvent
замістьfireEvent
для ближчої симуляції поведінки користувача. - Ізолюйте кожен тест, очищаючи рендер через
afterEach(cleanup)
(автоматично робиться RTL). - Пишіть тести як користувач — через
getByRole
,getByText
,getByLabelText
.
Висновок
Jest та React Testing Library — це потужна пара для побудови надійних UI-тестів. Вони дозволяють не тільки перевіряти, чи працює компонент, а й гарантувати, що користувацький досвід відповідає очікуванням. Якщо ви використовуєте Next.js — трошки більше налаштування, але результат того вартий. Тестуйте не реалізацію, а поведінку — і ваші додатки будуть стабільними.