В React Testing Library (RTL) одним из ключевых способов проверки
взаимодействия с формами является поиск элементов по их текущему
значению. Метод getByDisplayValue предназначен именно для
этого: он позволяет находить элементы форм, такие как
<input>, <textarea> или
<select>, основываясь на значении, которое уже
установлено в поле.
const element = screen.getByDisplayValue(value, options);
value — строка, регулярное выражение или функция, по
которому осуществляется поиск значения поля.options — объект с дополнительными настройками, такими
как selector, который позволяет уточнить тип элемента
(например, "input", "textarea").Ключевой момент: getByDisplayValue ищет
именно отображаемое значение, а не defaultValue
напрямую. Для <input> это значение из
value, которое React устанавливает через состояние
компонента или через defaultValue при первом рендере.
render(<input type="text" value="Пример" readOnly />);
const input = screen.getByDisplayValue('Пример');
expect(input).toBeInTheDocument();
В этом примере поле <input> сразу содержит
значение "Пример". Метод getByDisplayValue
позволяет получить этот элемент без необходимости указывать
id или placeholder.
render(<input type="text" value="React Testing" readOnly />);
const input = screen.getByDisplayValue(/react testing/i);
expect(input).toBeInTheDocument();
Регулярные выражения делают поиск более гибким, позволяя не зависеть от точного написания строки.
<textarea>render(<textarea value="Тестовая строка" readOnly />);
const textarea = screen.getByDisplayValue('Тестовая строка');
expect(textarea).toBeVisible();
getByDisplayValue одинаково корректно работает и с
<textarea>, обеспечивая единый подход к тестированию
полей ввода текста.
<select> и выбранных опцийrender(
<select value="option2" onCha nge={() => {}}>
<option value="option1">Опция 1</option>
<option value="option2">Опция 2</option>
</select>
);
const select = screen.getByDisplayValue('Опция 2');
expect(select.value).toBe('option2');
Важно различать value элемента и отображаемый текст
<option>. getByDisplayValue ищет элемент
формы по отображаемому значению, которое соответствует
выбранной опции.
getByDisplayValue от других методов поискаgetByLabelText ищет элементы по связанным с ними
<label>.getByPlaceholderText ориентируется на атрибут
placeholder.getByValue не существует в RTL, поэтому для поиска по
текущему значению нужно использовать именно
getByDisplayValue.Использование getByDisplayValue особенно актуально при
тестировании:
controlled components), где
значение поля связано с состоянием React.<select>.<input> или <textarea> управляются
состоянием, getByDisplayValue всегда возвращает актуальное
значение, что делает тесты стабильными при изменениях состояния.i.getByDisplayValue
выбрасывает исключение. Для мягкой проверки лучше использовать
queryByDisplayValue, который возвращает
null.const element = screen.queryByDisplayValue('Не существующее значение');
expect(element).toBeNull();
selector:const input = screen.getByDisplayValue('Пример', { selector: 'input[type="text"]' });
getByDisplayValue полезен и для проверки обновления
значения после пользовательских действий:
render(<input type="text" value={value} onCha nge={(e) => setValue(e.target.value)} />);
userEvent.type(screen.getByDisplayValue(''), 'Новый текст');
expect(screen.getByDisplayValue('Новый текст')).toBeInTheDocument();
Это позволяет тестировать реакцию компонента на ввод без прямой
работы с value через DOM.
Метод getByDisplayValue обеспечивает точный и
надежный способ проверки значений полей формы. Он идеально
подходит для:
<select> и
<textarea>.Его правильное использование повышает читаемость тестов и снижает
вероятность ошибок, связанных с выбором элементов по менее надежным
атрибутам, таким как id или placeholder.