В процессе тестирования компонентов React важной частью является правильная и эффективная навигация по дереву рендеринга, которое генерирует компонент. Для этого Enzyme предоставляет несколько утилит, которые позволяют осуществлять поиск элементов по различным критериям. Один из самых простых и универсальных способов поиска — это поиск по тегу.
Поиск по тегу — это способ нахождения элементов в сгенерированном
дереве, основываясь на их типе или имени тега (например,
div, span, button, и так далее).
Это полезно в тех случаях, когда необходимо проверить структуру
компонента и взаимодействие с его элементами, не привязываясь к
конкретным аттрибутам или классу.
find()В Enzyme для поиска по тегу используется метод find().
Этот метод позволяет найти все компоненты или элементы с указанным тегом
или селектором. В случае поиска по тегу передается строка, которая
соответствует имени тега.
Пример использования:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('должен содержать кнопку', () => {
const wrapper = shallow(<MyComponent />);
const button = wrapper.find('button');
expect(button).toHaveLength(1);
});
});
В данном примере происходит поиск всех элементов с тегом
<button> в рендере компонента
MyComponent. Если такой элемент найден, метод
find() вернёт объект, который можно использовать для
дальнейших проверок.
find()Поиск всех элементов с данным тегом: Когда передается только имя тега, метод возвращает все элементы этого типа, которые присутствуют в дереве компонента. Это полезно, если нужно проверить, сколько таких элементов существует.
Метод возвращает обёртку: find()
всегда возвращает объект обёртки, с которым можно взаимодействовать,
например, проверять количество найденных элементов, вызывать методы
взаимодействия и т. д.
Метод поддерживает цепочку вызовов: После вызова
find() можно применять другие методы Enzyme для более
детального анализа найденных элементов, такие как text(),
prop(), simulate(), и т. д.
Пример с дополнительными методами:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('должен содержать кнопку с текстом "Submit"', () => {
const wrapper = shallow(<MyComponent />);
const button = wrapper.find('button');
expect(button).toHaveLength(1);
expect(button.text()).toBe('Submit');
});
});
Иногда возникает необходимость искать элементы внутри конкретного компонента или контейнера. Для этого Enzyme предоставляет возможность выполнять поиск по тегу внутри другого найденного элемента. Например, можно сначала найти контейнер с определенным классом, а затем внутри него искать все кнопки.
Пример:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('должен содержать кнопку внутри контейнера с классом "form-container"', () => {
const wrapper = shallow(<MyComponent />);
const formContainer = wrapper.find('.form-container');
const button = formContainer.find('button');
expect(button).toHaveLength(1);
});
});
Здесь сначала находим элемент с классом form-container,
а затем уже внутри него ищем все элементы с тегом
button.
Метод find() поддерживает не только простые теги, но и
более сложные селекторы, такие как классы, id, атрибуты и т. д. Это дает
возможность комбинировать поиск по тегу с другими критериями.
Пример комбинированного поиска:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('должен содержать кнопку с классом "submit-button"', () => {
const wrapper = shallow(<MyComponent />);
const button = wrapper.find('button.submit-button');
expect(button).toHaveLength(1);
});
});
Здесь осуществляется поиск кнопки с тегом button и
классом submit-button.
Хотя поиск по тегу является мощным инструментом, он может быть ограничен в следующих случаях:
Нет различий между элементами: Если несколько элементов в дереве компонента имеют одинаковый тег, поиск по тегу может вернуть все эти элементы. Это может привести к трудностям в тестировании, если нужно точно проверить конкретный элемент. В таких случаях полезно использовать более специфичные селекторы (например, классы или атрибуты).
Не работает с компонентами: Если внутри
компонента используется собственный компонент React (например,
MyComponent), то поиск по тегу не сработает. Вместо этого
нужно искать компонент через его тип или использовать более точные
методы поиска.
В случае, когда нужно найти не обычные DOM-элементы, а компоненты
React, можно использовать другой способ поиска, который будет отличаться
от поиска по тегу. Например, для поиска компонента в Enzyme можно
использовать find() с указанием имени компонента.
Пример:
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
import ChildComponent from './ChildComponent';
describe('MyComponent', () => {
it('должен содержать компонент ChildComponent', () => {
const wrapper = shallow(<MyComponent />);
const childComponent = wrapper.find(ChildComponent);
expect(childComponent).toHaveLength(1);
});
});
Здесь ChildComponent — это не HTML-тег, а
React-компонент. Этот метод полезен, когда нужно искать вложенные
компоненты в дереве.
Поиск по тегу является основным инструментом для поиска элементов в тестах с использованием Enzyme. Это удобный способ найти элементы по типу тега, что помогает проверить правильность структуры компонентов. Важно помнить о возможности комбинирования поиска по тегу с другими селекторами, а также использовать методы для работы с более сложными структурами, такими как компоненты React.