Чем отличаются getBy, queryBy и findBy в Testing Library?
- Как проверить, что элемента нет на странице?
getBy… — элемент должен быть сейчас, иначе ошибка. queryBy… — возвращает null, если элемента нет: для проверки отсутствия (expect(queryByText("Ошибка")).not.toBeInTheDocument()). findBy… — асинхронно ждёт появления (промис, по умолчанию до 1 секунды): для того, что появляется после загрузки. Варианты …AllBy возвращают массивы. Приоритет запросов: ByRole → ByLabelText → ByPlaceholderText → ByText → ByTestId — последний, когда остальное невозможно.
- waitFor — ждать выполнения произвольной проверки
- screen.debug() — посмотреть текущий DOM
- getByTestId — признак, что разметка недоступна
А ещё getBy для проверки отсутствия упадёт раньше проверки
Подробно
expect(screen.getByRole("heading", { name: "Заказы" })).toBeInTheDocument();
expect(await screen.findByText("Заказ №42")).toBeInTheDocument();
expect(screen.queryByRole("alert")).toBeNull();Что хотят услышать
- get — должен быть, query — может не быть, find — подождать.
- Приоритет ByRole.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗getBy возвращает null, если элемента нет, а queryBy бросает ошибку и останавливает тест
- ✗findBy синхронный и не ждёт появления элемента, а getBy повторяет поиск до таймаута
- ✗ByTestId — самый предпочтительный способ поиска, потому что не зависит от текста и ролей
- ✓getBy — элемент обязан быть, queryBy — null при отсутствии, findBy ждёт асинхронно
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.