JS: Dom Testing Library
Теория: Запросы (Queries)
При взаимодействии с документом, в тесте, нам понадобится постоянно выбирать элементы для выполнения над ними действий или проверок. Это можно сделать в тестах стандартными браузерными средствами через querySelector():
Но у такого способа есть ряд серьезных недостатков:
-
Если ничего не вернется, то Testing Library никак не сможет помочь в отладке. Мы просто получим ошибку попытки работы с
null, в дальнейшем коде. -
Если мы выбираем элемент, который появляется асинхронно, после какого-то предыдущего действия, например отправки формы, то его может не оказаться в DOM, так как прошло слишком мало времени. Придется самостоятельно организовывать режим ожидания изменений в DOM.
-
Такой способ поиска приводит к сильной завязке на внутреннюю структуру документа, к которым относятся классы. Это порождает хрупкие тесты.
По этим причинам, Testing Library предоставляет большой набор собственных методов. Эти методы работают с видимой частью документа, а сами запросы базируются не на классах или идентификаторах, а на названиях, ролях элементов и в крайнем случае на специальном атрибуте data-testid.
getByLabelText
В тесте игры крестики-нолики проверяется первый экран, а для этого нужно выбрать поля для ввода. В Testing Library эту задачу можно выполнить с помощью метода getByLabelText() объекта screen, который, внутри себя, обращается к document. Этот метод, исходя из названия, ищет элемент формы, связанный с лейблом, содержащим переданный текст.
В отличие от querySelector(), если ничего не будет найдено, метод getByLabelText() выбросит исключение, а в терминале отобразиться текущий HTML. Хотя скорее всего, его будет слишком много и для отладки понадобится vitest-preview.
getByRole
Другой способ выполнить эту же задачу состоит в использовании метода getByRole(). Сначала посмотрим на пример, а потом разберем как он работает.
Метод getByRole() ищет элементы на базе их роли в соответствии с ARIA, частью системы доступности, которая описывает роли и атрибуты элементов интерфейса.
Это наиболее универсальный способ поиска элементов, с которыми можно взаимодействовать. К его преимуществам можно отнести вывод в случае ошибок. Testing Library показывает какие роли вообще есть в документе:
getAllBy
У каждого метода getBy есть альтернативный вариант getAllBy. Как следует из названия, эти методы возвращают коллекции, если мы ищем больше одного элемента.
Выведет в терминал:
Если не было найдено ни одного элемента, то будет выброшено исключение
queryBy && queryAllBy
В некоторых ситуациях бывает нужно продолжить работу, даже если не было найдено ни одного элемента, например при проверке, что элемент в DOM дереве не найден или пропал из него после определенных действий. В таком случае вместо методов getBy и getByAll используются методы queryBy и queryAllBy. Это единственное их отличие.
Чтобы не запутаться, посмотрите на эту табличку:
Дополнительные методы поиска
Но это еще не все, помимо методов перечисленных выше, Testing Library предоставляет пачку других:
getByPlaceholderText()- поиск по плейсхолдеруgetByText()- поиск по текстовому содержимому элементаgetByDisplayValue()- поиск по текущему значению в элементе, например, тексту в формеgetByAltText()- поиск по тексту в атрибутеaltу картинокgetByTitle()- поиск по тексту в атрибутеtitle
Расширенное сопоставление текста
Большая часть этих методов умеет работать не только со строками. Например, в эти методы можно передавать регулярные выражения:
Еще один вариант, это кастомная проверка через передачу функции:
testid
Особняком стоит метод getByTestId(). Он используется в том случае, когда до элемента нельзя или неудобно добираться любым другим способом. Для его работы нужно добавить атрибут data-testid в тот элемент, который мы ищем.
После этого заработает поиск:
В отличие от классов и других элементов связанных с HTML, testid используется только для тестов, поэтому хрупкость подобных тестов ниже. Несмотря на это, использовать testid стоит только в крайних случаях, потому что он удаляет нас от работы со страницей в режиме пользователя.
Подход с testid пригодится для тестирования игры крестики-нолики. Когда мы доходим до поля с игрой, то каждая клетка это просто ячейка в табличке (визуально). У этих ячеек нет специального значения и к ним просто так не обратиться. Поэтому в этом случае логично добавить testid:
А сам тест игры будет выглядеть так:
Алгоритм выбора поискового метода
При выборе методов запросов в Testing Library, имеет смысл придерживаться рекомендацией создателей библиотеки, чтобы обеспечить надежные и легко поддерживаемые тесты. Ниже приведен алгоритм для выбора методов запросов:
-
Используйте методы с приоритетом доступности (ByRole, ByLabelText, ByPlaceholderText, ByText).
- Эти методы имитируют то, как пользователи взаимодействуют с приложением.
- ByRole: Используйте, когда элемент имеет определенную роль (например, кнопка, заголовок).
- ByLabelText: Используйте для элементов формы, связанных с метками.
- ByPlaceholderText: Используйте для элементов формы с атрибутом placeholder.
- ByText: Используйте для элементов, которые содержат текст.
-
Используйте методы с пониженным приоритетом (ByDisplayValue, ByAltText, ByTitle)
- Эти методы также имитируют пользовательское взаимодействие, но менее предпочтительны, чем предыдущие.
- ByDisplayValue: Используйте для элементов формы, отображающих определенное значение.
- ByAltText: Используйте для изображений с атрибутом
alt.
- ByTitle: Используйте для элементов с атрибутом
title.
-
Используйте методы с еще более низким приоритетом (ByTestId)
- Эти методы менее предпочтительны, так как они не имитируют взаимодействие пользователя и могут затруднять поддержку тестов.
- ByTestId: Используйте только в крайнем случае, если нет других вариантов.
Следуя этому алгоритму, ваши тесты будут надежными, поддерживаемыми и ориентированными на пользовательское взаимодействие.
Рекомендуемые программы
Завершено
0 / 7

