Jest является одним из самых популярных инструментов для тестирования в экосистеме React. Он предоставляет мощные возможности для написания и выполнения тестов, а также интеграции с различными библиотеками. В сочетании с React Testing Library (RTL) он становится идеальным решением для тестирования React-компонентов, так как позволяет писать тесты, максимально приближенные к реальному взаимодействию с приложением. Правильная настройка Jest для работы с React Testing Library требует нескольких шагов, начиная от конфигурации самого Jest до интеграции с RTL.
Перед началом работы с Jest и React Testing Library необходимо установить все необходимые зависимости. Это можно сделать с помощью npm или yarn:
npm install --save-dev jest @testing-library/react @testing-library/jest-dom @testing-library/user-event
После установки этих зависимостей, можно приступать к настройке Jest.
Для полноценной работы с Jest и React Testing Library необходимо
создать или отредактировать конфигурационный файл Jest. В большинстве
случаев, для React-проектов, конфигурацию можно задать в
package.json, но для более гибкой настройки рекомендуется
использовать отдельный файл конфигурации — jest.config.js.
В данном случае будет рассмотрена конфигурация с использованием файла
jest.config.js.
Пример минимальной конфигурации для Jest:
module.exports = {
testEnvironment: 'jsdom',
transform: {
'^.+\\.[t|j]sx?$': 'babel-jest',
},
setupFilesAfterEnv: [
'@testing-library/jest-dom/extend-expect',
'<rootDir>/src/setupTests.js',
],
moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
testPathIgnorePatterns: ['/node_modules/', '/build/'],
coverageDirectory: 'coverage',
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}', '!src/index.js'],
};
window и document,
которые необходимы для работы с React-компонентами.@testing-library/jest-dom для расширения Jest новыми
матчерами, такими как .toBeInTheDocument(), а также создаём
свой файл конфигурации setupTests.js, который может быть
полезен для дополнительных настроек.Базовая настройка TypeScript
Если проект использует TypeScript, необходимо добавить несколько
настроек для работы с ним. Jest требует использования
ts-jest для трансформации TypeScript-кода. Для этого нужно
установить ts-jest:
npm install --save-dev ts-jest
После этого в конфигурации Jest нужно указать трансформатор:
transform: {
'^.+\\.[t|j]sx?$': 'ts-jest',
},Настройка глобальных переменных
В тестах с React Testing Library часто приходится работать с
глобальными объектами, такими как window,
document или localStorage. Для настройки этих
объектов можно использовать файл setupTests.js:
import '@testing-library/jest-dom';
import { server } from './mocks/server'; // если используется Mock Service Worker (MSW)
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
Этот файл будет автоматически загружен Jest при каждом запуске тестов
благодаря настройке в setupFilesAfterEnv.
Mocking и статики
Иногда бывает полезно настроить моки для импортируемых модулей или
статики. Jest предоставляет для этого функцию jest.mock(),
которая позволяет заменить импорты на моки, облегчая тестирование
компонентов в изоляции.
Например, если компонент использует изображение или стиль, можно замокать его:
jest.mock('./image.jpg', () => 'mocked-image.jpg');
Таким образом, вместо реального изображения будет использоваться
строка 'mocked-image.jpg', что позволит избежать ошибок при
рендеринге тестов.
React Testing Library фокусируется на тестировании компонентов, как они отображаются и взаимодействуют с пользователем, а не на тестировании их реализации. Для эффективного использования RTL с Jest важно понимать, как компоненты рендерятся и как взаимодействовать с ними.
Для рендеринга компонента используется метод render из
@testing-library/react. Он возвращает объект с несколькими
полезными методами для взаимодействия с компонентом.
Пример рендеринга компонента:
import { render, screen } from '@testing-library/react';
import MyComponent from './MyComponent';
test('проверка текста в компоненте', () => {
render(<MyComponent />);
const textElement = screen.getByText(/hello world/i);
expect(textElement).toBeInTheDocument();
});
render(<MyComponent />) — рендерит
компонент.screen.getByText(/hello world/i) — ищет элемент с
текстом, который соответствует регулярному выражению.expect(textElement).toBeInTheDocument() — проверяет,
что элемент с нужным текстом присутствует в DOM.Для симуляции действий пользователя используется библиотека
@testing-library/user-event. Она предоставляет API для
имитации кликов, ввода текста, выбора значений в формах и прочего.
Пример симуляции клика:
import userEvent from '@testing-library/user-event';
import { render, screen } from '@testing-library/react';
import MyButton from './MyButton';
test('проверка клика по кнопке', () => {
render(<MyButton />);
const button = screen.getByRole('button');
userEvent.click(button);
expect(screen.getByText(/кнопка нажата/i)).toBeInTheDocument();
});
Здесь с помощью userEvent.click(button) симулируется
клик по кнопке, а затем проверяется, появился ли текст, который должен
отобразиться после нажатия.
Jest позволяет автоматически генерировать отчёты о покрытии тестами. Для этого в конфигурации нужно указать соответствующие параметры. Покрытие может быть полезным для анализа, насколько хорошо тестируются компоненты и части приложения.
Пример конфигурации для покрытия тестами:
collectCoverage: true,
collectCoverageFrom: ['src/**/*.{js,jsx,ts,tsx}'],
coverageReporters: ['text', 'lcov'],
После выполнения тестов Jest сгенерирует отчёт о покрытии, который можно будет просмотреть прямо в консоли или в виде HTML-отчёта.
Корректная настройка Jest и интеграция с React Testing Library позволяет писать тесты, максимально приближенные к реальному взаимодействию с приложением. Для этого важно настроить все необходимые инструменты и конфигурации, включая рендеринг компонентов, симуляцию действий пользователя и работу с глобальными объектами.