#html #reactjs #react-testing-library
#HTML #reactjs #react-тестирование-библиотека
Вопрос:
Я использую библиотеку тестирования react для тестирования выпадающего компонента, чтобы проверить, доступна ли конкретная опция в поиске, и раньше она работала должным образом, используя следующий запрос, который утверждает, что опция выбрана или нет.
expect(
screen.getByRole('option', {
name: 'ZAT',
selected: false,
})
).toBeInTheDocument();
Введена новая функция, при которой я выделяю поисковый запрос в списке параметров, и тесты начали прерываться, поскольку введение mark
тега or span
(с примененным стилем) создает пустое пространство в тестовом средстве визуализации, из-за которого запрос больше не может найти опцию с точным текстом из-за сгенерированных пробеловв имени доступного элемента (даже если пробелы свернуты в DOM)
Интересно, есть ли у кого-нибудь какие-либо указания относительно того, как я могу это исправить, чтобы тесты работали должным образом.
Комментарии:
1. Я не вижу альтернативы, кроме изменения
name
того, что вы проверяете, чтобы включить пробелы :screen.getByRole('option', { name: /z a t/i, selected: false })
.2. Конечно. Это последний вариант, который я имел в виду, если я не придумаю никакого другого решения для его учета.
3. @juliomalves нашел лучшее решение без настройки моих тестовых примеров.
Ответ №1:
После некоторого расследования было найдено лучшее решение проблемы, с которой я столкнулся. Вместо того, чтобы полагаться на имя по умолчанию, которое ассоциируется с элементом, мы можем предоставить aria-label
атрибут для рассматриваемых элементов как ARIA
triumphs all в соответствии с this article — Используя aria
Введение aria-label
в элемент, похоже, устраняет проблему, и тесты работают, как ожидалось, без каких-либо изменений.
<li
aria-label="ZAT"
aria-selected="false"
class="SearchableDropdown__StyledMenuContent-l5l1l4-4 iNSwly"
id="downshift-1-item-2"
role="option"
>
....
</li>
Комментарии:
1. Знаете ли вы, как выбрать опцию (содержащую вложенные элементы, аналогичные тому, что указан в вашем вопросе), используя UserEvent ? Я пытался использовать опцию UserEvent.click, но это никак не влияет на текстовое поле. В идеале, после выбора, выбранное значение должно появиться в текстовом поле.