В тестировании пользовательских интерфейсов с использованием библиотеки Enzyme для React одной из распространённых задач является проверка видимости элементов на странице. Это важно для того, чтобы убедиться, что компоненты корректно рендерятся в зависимости от состояния приложения и могут быть взаимодействованы пользователем. Видимость элемента — это состояние, которое указывает на то, видим ли элемент на экране, или он скрыт, например, с помощью CSS-стилей.
В Enzyme для выполнения тестов видимости используются методы рендеринга и различные инструменты для симуляции взаимодействий с DOM.
Прежде чем проверять видимость элемента, необходимо убедиться, что он
существует в DOM. В Enzyme для этого используется метод
.find(). Этот метод позволяет найти элементы по селекторам,
переданным в качестве аргументов, и возвращает коллекцию найденных
элементов.
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
test('проверка, что элемент существует', () => {
const wrapper = shallow(<MyComponent />);
const element = wrapper.find('.my-element');
expect(element.exists()).toBe(true);
});
Метод .exists() возвращает true, если
элемент найден в DOM, и false, если его нет.
После того как подтверждено существование элемента, можно проверить
его видимость. В Enzyme для этого используется метод
.is(':visible'), который является оберткой для jQuery и
позволяет проверить, виден ли элемент в текущем контексте.
test('проверка, что элемент видим', () => {
const wrapper = shallow(<MyComponent />);
const element = wrapper.find('.my-element');
expect(element.is(':visible')).toBe(true);
});
Этот метод проверяет, не скрыт ли элемент с помощью CSS-свойств,
таких как display: none или
visibility: hidden.
Когда элемент скрыт с помощью CSS, его видимость становится недоступной для пользователя, но он может оставаться в DOM. Рассмотрим пример компонента, где элемент скрывается с помощью класса, изменяющего стиль:
import React, { useState } from 'react';
function MyComponent() {
const [isVisible, setIsVisible] = useState(false);
return (
<div>
<button onCl ick={() => setIsVisible(!isVisible)}>Переключить видимость</button>
<div className={`my-element ${isVisible ? 'visible' : 'hidden'}`}>Текст</div>
</div>
);
}
В этом примере элемент скрывается или показывается в зависимости от
состояния компонента. Для тестирования видимости в этом случае можно
использовать сочетание методов .find() и
.is(':visible').
test('проверка, что элемент скрыт по умолчанию', () => {
const wrapper = shallow(<MyComponent />);
const element = wrapper.find('.my-element');
expect(element.is(':visible')).toBe(false);
});
test('проверка, что элемент становится видимым при изменении состояния', () => {
const wrapper = shallow(<MyComponent />);
wrapper.find('button').simulate('click');
const element = wrapper.find('.my-element');
expect(element.is(':visible')).toBe(true);
});
Когда элемент скрыт с помощью CSS-свойства
display: none, он физически удаляется из потока документа,
что делает его недоступным для большинства методов тестирования, включая
.is(':visible'). В случае необходимости проверки, скрыт ли
элемент через display: none, можно использовать
дополнительные подходы.
Для такого тестирования стоит использовать getDOMNode()
для получения прямого доступа к DOM-элементу:
test('проверка, что элемент скрыт через display: none', () => {
const wrapper = shallow(<MyComponent />);
const element = wrapper.find('.my-element').getDOMNode();
expect(element.style.display).toBe('none');
});
Этот способ позволяет детально проверить стили элемента, даже если он не видим на странице.
mount()Если задача заключается в тестировании реального рендеринга
компонентов с их состоянием и поведением в DOM, то стоит использовать
метод mount(), который выполняет полное рендеринг
компонента и позволяет проверять не только видимость, но и
взаимодействие с реальным DOM.
import { mount } from 'enzyme';
test('проверка видимости элемента после клика', () => {
const wrapper = mount(<MyComponent />);
const button = wrapper.find('button');
button.simulate('click');
const element = wrapper.find('.my-element');
expect(element.is(':visible')).toBe(true);
});
Метод mount() позволяет проводить более сложные тесты,
где нужно учесть все особенности поведения компонента в реальном
окружении.
В некоторых случаях для проверки видимости элемента требуется более точная настройка условий тестирования. Например, нужно проверить, виден ли элемент только при наличии определённого контекста или состояния, связанного с родительскими элементами.
В таких ситуациях можно комбинировать методы Enzyme с условными операциями, чтобы точно моделировать поведение компонента. Например:
test('проверка видимости элемента в зависимости от родительского компонента', () => {
const wrapper = mount(<ParentComponent />);
const element = wrapper.find('.child-element');
if (wrapper.find('.parent-element').hasClass('active')) {
expect(element.is(':visible')).toBe(true);
} else {
expect(element.is(':visible')).toBe(false);
}
});
Этот тест проверяет, что дочерний элемент становится видимым только в случае, если родительский элемент активен.
Проверка видимости элемента является важной частью тестирования
интерфейсов, так как она позволяет убедиться в корректном отображении и
функциональности компонентов. В Enzyme для этого существует ряд удобных
методов, таких как .find(), .is(':visible'),
.getDOMNode(), а также использование методов рендеринга
shallow() и mount(). Важно учитывать различные
способы скрытия элементов (CSS-свойства, состояние компонента) и
выбирать соответствующие методы для тестирования видимости в зависимости
от контекста.