В React Testing Library (RTL) объект screen является
центральным инструментом для взаимодействия с DOM в тестах. Он
предоставляет единый интерфейс для поиска элементов на
странице и является предпочтительным подходом по сравнению с
возвратом результатов из render напрямую. Использование
screen повышает читаемость тестов и снижает необходимость
явно деструктурировать возвращаемые значения.
screenscreen — это глобальный объект, который содержит
методы поиска элементов. При рендеринге компонента с
помощью render DOM автоматически подключается к
screen, что позволяет использовать его методы без
дополнительного присвоения.
import { render, screen } from '@testing-library/react';
import Button from './Button';
render(<Button>Click me</Button>);
const button = screen.getByText('Click me');
Ключевые моменты:
screen работает с реальным DOM,
созданным в тестовом окружении.screen делает тесты более
декларативными, так как поиск элементов происходит через
понятные методы.screenМетоды поиска в screen делятся на несколько категорий, в
зависимости от того, как они ведут себя при отсутствии элемента:
Методы, вызывающие исключение при отсутствии
элемента (getBy*):
getByText()getByRole()getByLabelText()getByPlaceholderText()getByAltText()getByTitle()Пример:
const input = screen.getByLabelText('Username');Методы, возвращающие массив элементов
(getAllBy*):
const items = screen.getAllByRole('listitem');Методы, возвращающие null при отсутствии
элемента (queryBy*):
null.expect(screen.queryByText('Loading...')).toBeNull();Асинхронные методы (findBy*):
const user = await screen.findByText('John Doe');Метод getByRole является самым рекомендуемым
способом поиска элементов в RTL, так как он ориентирован на
доступность (accessibility). Он учитывает такие атрибуты, как
aria-label и aria-labelledby, и позволяет
тестировать компоненты с точки зрения пользователя.
const submitButton = screen.getByRole('button', { name: /submit/i });
name позволяет уточнить элемент по видимому
тексту или aria-label.Методы getByText и queryByText позволяют
искать элементы по видимому тексту. Можно использовать
строки или регулярные выражения.
const welcomeMessage = screen.getByText(/welcome, john/i);
getByLabelText() — связывает <label>
и <input> через for или
вложенность.getByPlaceholderText() — ищет элементы по атрибуту
placeholder.const emailInput = screen.getByLabelText('Email');
const searchInput = screen.getByPlaceholderText('Search...');
Эти методы делают тесты более декларативными и читаемыми, поскольку они отражают пользовательский опыт.
Комбинация queryBy* и Jest-матчеров позволяет
проверять, что элемент не отображается.
expect(screen.queryByText('Error')).not.toBeInTheDocument();
getBy*, который выбросит ошибку.findBy* методы используют встроенный
таймаут и повторный поиск, что позволяет работать с
компонентами, которые изменяют DOM после событий или асинхронных
операций.
const profileName = await screen.findByText('Alice');
waitFor для ожидания
элемента.setTimeout или
дополнительных промисов.screenВсегда отдавать предпочтение screen вместо
деструктурирования render, например:
render(<App />);
screen.getByText('Hello World');Использовать getByRole для интерактивных
элементов, чтобы тесты отражали доступность.
Для проверки отсутствия элементов использовать
queryBy*.
Для динамических компонентов использовать
findBy*, чтобы дождаться появления элементов.
Избегать тестирования по классам и селекторам, так как это делает тесты хрупкими.
Объект screen является ядром поиска
элементов в React Testing Library, позволяя писать тесты
чисто, декларативно и стабильно. Владение его методами
и понимание различий между getBy*, queryBy* и
findBy* позволяет создавать тесты, ориентированные на
пользователя, и поддерживать их при развитии приложения.