React Testing Library (RTL) предоставляет набор методов для поиска и взаимодействия с элементами DOM в тестах. Основной принцип библиотеке — тестировать компоненты так, как пользователь взаимодействует с интерфейсом, а не опираться на внутренние реализации. В центре внимания находятся queries — функции поиска элементов.
Все методы поиска можно разделить на несколько категорий по степени предпочтительности:
null.React Testing Library рекомендует ориентироваться на доступность (Accessibility), а не на классы или id. Это повышает стабильность тестов и делает их ближе к пользовательскому сценарию. Основные методы:
button, heading,
textbox. Опции позволяют уточнять имя или уровень
заголовка.label, связанному с input.alt.title.Пример:
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import LoginForm from './LoginForm';
render(<LoginForm />);
const usernameInput = screen.getByLabelText(/имя пользователя/i);
userEvent.type(usernameInput, 'testuser');
const submitButton = screen.getByRole('button', { name: /войти/i });
userEvent.click(submitButton);
В этом примере поиск выполняется по label и роль кнопки, что полностью соответствует пользовательскому сценарию.
Многие методы getBy и их аналоги поддерживают
дополнительные опции:
h1,
h2 и т.д.).Пример:
screen.getByRole('heading', { level: 2, name: /профиль пользователя/i });
Для компонентов, которые загружают данные или рендерят контент с
задержкой, используют findBy. Этот метод возвращает промис,
что позволяет работать с async/await.
const userName = await screen.findByText(/загрузка завершена/i);
expect(userName).toBeInTheDocument();
Асинхронные queries применяются чаще всего при тестировании запросов
к API, динамических списков и эффектов, основанных на
useEffect.
null, если
элемент отсутствует. Используется для проверки отсутствия
элемента:expect(screen.queryByText(/ошибка/i)).not.toBeInTheDocument();
Использование queryBy повышает гибкость теста при
проверке условного рендера.
Когда ожидается несколько элементов, применяются методы с
AllBy. Они возвращают массив.
const items = screen.getAllByRole('listitem');
expect(items).toHaveLength(3);
Если ни один элемент не найден, getAllBy выбрасывает
ошибку, а queryAllBy возвращает пустой массив.
getByRole, getByLabelText.getByRole, getByLabelText,
getByText.queryByText,
queryByRole.findByText,
findByRole.getAllBy*,
queryAllBy*, findAllBy*.Эта система queries позволяет писать тесты, максимально приближенные к поведению пользователя, и обеспечивает стабильность даже при изменении структуры DOM или CSS.