Поиск по классу

В Enzyme поиск элементов по классу является одним из наиболее распространённых способов выборки DOM-элементов для последующих тестов. Этот метод активно используется при тестировании компонентов в JavaScript, поскольку он предоставляет удобный и быстрый способ проверки наличия и взаимодействия с элементами на основе их CSS-классов.

Основы поиска по классу

Enzyme предоставляет несколько методов для поиска элементов, среди которых find является основным и наиболее часто используемым. Метод find позволяет находить компоненты или элементы, которые соответствуют определённому селектору, включая классы, ID, теги или атрибуты. В случае поиска по классу используется синтаксис CSS-селектора, что позволяет эффективно обращаться к элементам с нужным классом.

Пример использования метода find для поиска по классу:

const wrapper = shallow(<MyComponent />);
const element = wrapper.find('.my-class');

В данном примере '.my-class' является CSS-классом, и метод find вернёт все элементы, которые имеют этот класс.

Ключевые особенности поиска по классу

  1. Чувствительность к регистру Важно помнить, что поиск по классу чувствителен к регистру. Класс my-class не будет найден, если в коде используется My-Class или другой вариант с различием в регистре.

  2. Поиск вложенных элементов Метод find выполняет поиск по всему дереву компонентов, включая вложенные элементы. Это означает, что если компонент с классом находится внутри другого компонента, то find всё равно найдёт этот элемент. Например:

    const wrapper = shallow(<MyComponent />);
    const childWrapper = wrapper.find('.parent').find('.child-class');

    Здесь сначала ищется элемент с классом .parent, затем в его пределах выполняется поиск элемента с классом .child-class.

  3. Поиск по нескольким классам Enzyme позволяет искать элементы, которые имеют несколько классов одновременно. Для этого используется синтаксис, который объединяет несколько классов через пробел:

    const wrapper = shallow(<MyComponent />);
    const element = wrapper.find('.class-one.class-two');

    В этом случае поиск будет происходить по элементам, которые имеют оба класса: class-one и class-two.

  4. Поиск по динамическим классам Когда классы генерируются динамически, например, на основе состояния компонента или пропсов, необходимо убедиться, что тесты выполняются с учётом таких изменений. Enzyme позволяет легко находить такие элементы, так как метод find возвращает обновлённый DOM после изменения состояния.

Примеры тестов с использованием поиска по классу

  1. Проверка наличия элемента с классом Один из наиболее распространённых тестов — это проверка, существует ли элемент с конкретным классом в компоненте. Например, в следующем коде проверяется, существует ли кнопка с классом .submit-button:

    test('кнопка submit отображается', () => {
      const wrapper = shallow(<MyComponent />);
      expect(wrapper.find('.submit-button').length).toBe(1);
    });
  2. Проверка взаимодействия с элементом по классу Для проверки взаимодействия с элементами, можно симулировать события, например, клик, и затем проверить, изменился ли компонент. Пример:

    test('клик по кнопке вызывает обработчик', () => {
      const mockHandler = jest.fn();
      const wrapper = shallow(<MyComponent onCl ick={mockHandler} />);
      wrapper.find('.submit-button').simulate('click');
      expect(mockHandler).toHaveBeenCalledTimes(1);
    });
  3. Проверка изменения класса Иногда нужно проверить, что класс элемента изменяется в зависимости от состояния компонента. Пример:

    test('класс изменяется после клика', () => {
      const wrapper = shallow(<MyComponent />);
      wrapper.find('.toggle-button').simulate('click');
      expect(wrapper.find('.active-class').length).toBe(1);
    });

Альтернативные методы поиска

Помимо метода find, в Enzyme есть и другие способы поиска элементов. Они могут быть полезны в зависимости от контекста:

  • filter — используется для фильтрации уже найденных элементов. Например, если вы сначала нашли все элементы с классом .item, а затем хотите оставить только те, что содержат текст “Active”:

    const wrapper = shallow(<MyComponent />);
    const activeItems = wrapper.find('.item').filterWhere(item => item.text() === 'Active');
  • children — возвращает дочерние компоненты текущего элемента. Это может быть полезно, если вам нужно найти элементы внутри определённого контейнера.

    const wrapper = shallow(<MyComponent />);
    const children = wrapper.find('.parent-class').children();

Оценка производительности

Метод find является достаточно быстрым, однако в случае поиска по большому дереву компонентов, особенно в сложных приложениях с множеством вложенных элементов, время выполнения может увеличиваться. Чтобы минимизировать время выполнения тестов, рекомендуется использовать более конкретные селекторы и избегать ненужных вложенных поисков.

Для больших компонентов или страниц можно воспользоваться инструментами профилирования, чтобы выявить узкие места в производительности тестов.

Заключение

Поиск элементов по классу с помощью Enzyme является мощным и универсальным инструментом для тестирования компонентов. Он позволяет не только находить элементы для проверки их состояния или взаимодействия, но и управлять различными вариантами поиска, учитывая вложенность, динамичность и другие особенности компонентов.