Тестирование компонентов, состоящих из других компонентов, является неотъемлемой частью обеспечения качества фронтенд-приложений. В некоторых случаях необходимо протестировать родительский компонент, при этом исключив сложную логику дочерних компонентов. Мокирование позволяет избежать ненужной сложности в тестах, делая их более предсказуемыми и изолированными.
Основная цель мокирования — изолировать тестируемую единицу, минимизируя зависимость от сторонних компонентов или библиотек. В случае с Enzyme мокирование дочерних компонентов позволяет:
Enzyme предоставляет несколько подходов для мокирования дочерних компонентов. Рассмотрим основные из них.
shallow рендерингаОдним из самых простых способов мокирования дочерних компонентов
является использование метода shallow рендеринга. В этом
случае Enzyme рендерит только сам компонент, без рендеринга всех его
вложенных элементов.
import { shallow } from 'enzyme';
import ParentComponent from './ParentComponent';
it('тестирует родительский компонент без реальных дочерних компонентов', () => {
const wrapper = shallow(<ParentComponent />);
// Тестируем родительский компонент
expect(wrapper.find('.parent-element')).toHaveLength(1);
});
В этом примере дочерние компоненты не рендерятся, и родительский компонент тестируется в изоляции. Такой подход подходит, если задача — проверить только структуру и поведение родительского компонента.
jest.mockДля более сложных случаев можно мокировать дочерние компоненты с помощью Jest. Это полезно, если необходимо симулировать поведение дочерних компонентов или избежать их реальной реализации. В этом случае мокируются сами компоненты или их поведение.
import React from 'react';
import { shallow } from 'enzyme';
import ParentComponent from './ParentComponent';
// Мокируем дочерний компонент
jest.mock('./ChildComponent', () => {
return () => <div className="mock-child" />;
});
it('тестирует родительский компонент с мокированным дочерним компонентом', () => {
const wrapper = shallow(<ParentComponent />);
// Проверяем, что мокированный дочерний компонент присутствует
expect(wrapper.find('.mock-child')).toHaveLength(1);
});
В этом примере дочерний компонент ChildComponent
заменяется на мок, который возвращает простой JSX элемент. Таким
образом, можно сосредоточиться на тестировании родительского компонента,
не заботясь о поведении дочернего.
mount с мокированием дочерних компонентовМетод mount рендерит компонент с полным DOM, что
позволяет взаимодействовать с компонентами на более глубоком уровне.
Когда требуется мокировать дочерние компоненты в таких тестах, можно
использовать их моки через jest.mock или с помощью
компонентных замен.
import React from 'react';
import { mount } from 'enzyme';
import ParentComponent from './ParentComponent';
import ChildComponent from './ChildComponent';
// Мокируем дочерний компонент
jest.mock('./ChildComponent', () => {
return () => <div className="mock-child" />;
});
it('тестирует родительский компонент с мокированным дочерним компонентом при полном рендеринге', () => {
const wrapper = mount(<ParentComponent />);
// Проверяем, что мокированный дочерний компонент присутствует
expect(wrapper.find('.mock-child')).toHaveLength(1);
});
В данном случае mount рендерит компонент с полным DOM,
что дает больше возможностей для проверки взаимодействий и
состояния.
Enzyme и SinonЕсли в компоненте есть взаимодействие с методами или событиями, которые должны быть мокированы, можно использовать такие инструменты, как Sinon. Это позволяет легко подменять функции и следить за их вызовами.
import React from 'react';
import { shallow } from 'enzyme';
import sinon from 'sinon';
import ParentComponent from './ParentComponent';
import ChildComponent from './ChildComponent';
it('тестирует родительский компонент с мокированием методов дочернего компонента', () => {
const spy = sinon.spy();
// Мокируем метод дочернего компонента
jest.spyOn(ChildComponent.prototype, 'methodName').mockImplementation(spy);
const wrapper = shallow(<ParentComponent />);
// Проверяем, что метод был вызван
expect(spy).toHaveBeenCalled();
});
С помощью таких инструментов, как Sinon, можно легко следить за вызовами методов и проверять, как родительский компонент взаимодействует с дочерними компонентами.
Мокирование дочерних компонентов в Enzyme — это мощный инструмент для улучшения качества тестов, позволяющий фокусироваться на тестировании логики родительского компонента, избегая ненужной сложности. Однако важно использовать этот инструмент с умом, чтобы не ограничить возможности тестирования и не создать ложное ощущение уверенности в правильности работы приложения.