Вопрос с собеседования · Frontend

Чем отличаются getBy, queryBy и findBy в Testing Library?

JuniorВыкатка и эксплуатация
Ещё спрашивают так:
  • Как проверить, что элемента нет на странице?
Коротко

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 минут бесплатно.

Разбор собеседования