При тестировании форм в веб-приложениях важным аспектом является корректная ассоциация элементов управления с соответствующими лейблами. В React Testing Library это можно сделать с помощью различных методов, позволяющих протестировать взаимодействие пользователя с элементами формы и убедиться, что лейблы правильно ассоциируются с полями ввода.
Корректная ассоциация лейблов с полями ввода не только улучшает доступность веб-страниц, но и упрощает автоматическое тестирование. Лейблы обеспечивают текстовую метку для полей ввода, что помогает пользователям, в том числе с ограниченными возможностями, понимать, к какому элементу относится конкретная метка. Для тестирования важно удостовериться, что лейблы правильно привязаны к полям ввода, так как это влияет на точность поиска элементов в тестах.
В HTML для связи лейбла с полем ввода используется атрибут
for, который должен соответствовать id поля. В
React компонентах лейблы обычно используют компоненты, которые
генерируют атрибуты в соответствии с требуемыми стандартами. Это
позволяет правильно отобразить и связать текстовую метку с элементом
формы.
Использование атрибута htmlFor в
лейбле В React компоненте атрибут for не
используется, так как это зарезервированное слово в JavaScript. Вместо
этого применяется атрибут htmlFor. Он должен быть связан с
атрибутом id на соответствующем поле ввода. Рассмотрим
пример:
<label htmlFor="username">Имя пользователя</label>
<input id="username" type="text" />
В этом примере лейбл с текстом «Имя пользователя» связан с полем
ввода с id="username". Это важный шаг для улучшения
доступности и правильной ассоциации элементов.
Использование вложенных лейблов В React лейблы
могут быть вложены непосредственно в поле ввода. В этом случае атрибут
htmlFor не нужен. Текст лейбла будет автоматически
ассоциирован с полем ввода.
<label>
Имя пользователя
<input type="text" />
</label>
В этом случае React правильно обрабатывает ассоциацию лейбла с полем
ввода, даже если атрибут htmlFor не используется.
В React Testing Library для поиска элементов на странице можно
использовать несколько методов. Для проверки корректной ассоциации
лейблов и полей часто используется метод getByLabelText,
который позволяет найти элементы ввода, основываясь на тексте их
лейблов.
Поиск с использованием
getByLabelText
import { render, screen } from '@testing-library/react';
test('должен отображать поле ввода с правильным лейблом', () => {
render(
<div>
<label htmlFor="username">Имя пользователя</label>
<input id="username" type="text" />
</div>
);
const input = screen.getByLabelText('Имя пользователя');
expect(input).toBeInTheDocument();
});
В данном примере метод getByLabelText используется для
поиска поля ввода, ассоциированного с лейблом «Имя пользователя». Если
ассоциация лейбла с полем ввода корректна, тест пройдет
успешно.
Проверка наличия ассоциации лейбла и поля В
случае, если лейбл не ассоциирован с полем, тест с использованием
getByLabelText не найдет элемент и выбросит ошибку.
Например, если атрибут htmlFor не будет указывать на
правильный id:
test('не должен находить поле ввода без правильного лейбла', () => {
render(
<div>
<label htmlFor="username">Имя пользователя</label>
<input id="email" type="email" />
</div>
);
// Тест не найдет поле ввода по лейблу
expect(() => screen.getByLabelText('Имя пользователя')).toThrow();
});
В этом примере метод getByLabelText не найдет поле ввода
с id="email", потому что лейбл ожидает привязку к полю с
id="username". Таким образом, тест подтвердит отсутствие
корректной ассоциации.
Поиск с использованием getByRole
Помимо getByLabelText, React Testing Library также
предоставляет метод getByRole, который может быть полезен
для поиска элементов формы по роли. Роль поля ввода — это
textbox, что позволяет найти его, если известен текст
лейбла.
test('поиск по роли', () => {
render(
<div>
<label htmlFor="username">Имя пользователя</label>
<input id="username" type="text" />
</div>
);
const input = screen.getByRole('textbox', { name: 'Имя пользователя' });
expect(input).toBeInTheDocument();
});
Этот метод полезен для более точного поиска элементов, если несколько лейблов на странице могут использовать одинаковые строки текста.
Использование getByPlaceholderText
В случае если элемент формы использует атрибут placeholder,
можно воспользоваться методом getByPlaceholderText. Однако,
важно помнить, что такой подход менее предпочтителен с точки зрения
доступности, так как текст в placeholder не всегда является полноценной
заменой лейблу.
test('поиск с использованием placeholder', () => {
render(
<div>
<input placeholder="Имя пользователя" type="text" />
</div>
);
const input = screen.getByPlaceholderText('Имя пользователя');
expect(input).toBeInTheDocument();
});
Такой тест может быть полезен для проверки интерфейсов, где placeholder используется в качестве метки, но его стоит избегать в тех случаях, когда возможен сбой доступности.
Тестирование ассоциации лейблов и полей ввода в первую очередь влияет
на доступность приложения. Использование лейблов с правильными
атрибутами htmlFor и id гарантирует, что
экраны чтения смогут правильно идентифицировать элементы формы. Для
тестирования доступности важно всегда проверять, что каждый лейбл связан
с соответствующим полем ввода, чтобы поддерживать универсальность
интерфейса.
В дополнение к этому, также стоит использовать метод axe
для проверки страницы на соответствие стандартам доступности, что
поможет выявить скрытые проблемы, связанные с доступностью.
Тестирование правильной ассоциации лейблов с полями ввода с
использованием React Testing Library является важным шагом для
обеспечения корректности и доступности пользовательских интерфейсов.
Используя методы, такие как getByLabelText,
getByRole, и другие, можно удостовериться, что форма
корректно работает с лейблами, а пользователи смогут эффективно
взаимодействовать с приложением.