В процессе тестирования компонентов React с использованием Enzyme часто возникает необходимость выделять повторяющиеся операции в отдельные функции. Это повышает читаемость тестов, облегчает их поддержку и уменьшает дублирование кода. Вспомогательные функции могут инкапсулировать рендеринг компонентов, поиск элементов, имитацию событий и проверку состояния.
Enzyme предоставляет три основных метода рендеринга:
Вспомогательная функция для рендеринга обычно принимает компонент и props:
import { shallow, mount } from 'enzyme';
export const renderShallow = (Component, props = {}) => shallow(<Component {...props} />);
export const renderMount = (Component, props = {}) => mount(<Component {...props} />);
Такой подход позволяет централизованно менять стратегию рендеринга без изменения всех тестов.
Часто нужно многократно искать одни и те же элементы, например кнопки или поля ввода. Вспомогательные функции упрощают этот процесс и повышают читаемость тестов:
export const findByTestAttr = (wrapper, attr) => wrapper.find(`[data-test="${attr}"]`);
export const findButton = (wrapper, text) => wrapper.find('button').filterWhere(node => node.text() === text);
Использование data-test атрибутов является стандартной
практикой для создания селекторов, не зависящих от структуры DOM и
классов.
Enzyme позволяет вызывать события через метод simulate.
Вспомогательные функции помогают унифицировать тестирование событий:
export const clickButton = (wrapper, attr) => {
findByTestAttr(wrapper, attr).simulate('click');
};
export const changeInput = (wrapper, attr, value) => {
findByTestAttr(wrapper, attr).simulate('change', { target: { value } });
};
Такой подход упрощает повторное использование и минимизирует ошибки при передаче событий.
Вспомогательные функции позволяют централизованно проверять состояние компонентов или значения пропсов:
export const expectState = (wrapper, key, expected) => {
expect(wrapper.state(key)).toBe(expected);
};
export const expectProp = (wrapper, key, expected) => {
expect(wrapper.prop(key)).toBe(expected);
};
Использование таких функций делает тесты компактными и легко читаемыми, особенно при большом числе проверок.
testUtils.js или enzymeHelpers.js,
чтобы избежать дублирования.Пример структуры файла:
// testUtils.js
export * from './renderHelpers';
export * from './findHelpers';
export * from './eventHelpers';
export * from './assertHelpers';
Функции должны быть максимально универсальными:
Пример:
export const renderAndFind = (Component, props, attr) => {
const wrapper = renderMount(Component, props);
return findByTestAttr(wrapper, attr);
};
Это позволяет в одном вызове создать компонент и сразу получить нужный элемент.
Вспомогательные функции легко интегрируются с Jest:
import { renderShallow, clickButton, expectState } from './testUtils';
test('кнопка увеличивает счетчик', () => {
const wrapper = renderShallow(Counter);
clickButton(wrapper, 'increment-btn');
expectState(wrapper, 'count', 1);
});
Такой подход делает тесты выразительными и минимизирует повторяющийся код.
Для сложных компонентов часто создают фабрики, которые возвращают компонент с набором стандартных props. В сочетании с вспомогательными функциями это позволяет быстро создавать разнообразные тестовые сценарии:
export const createUserForm = (overrides = {}) => ({
username: 'testUser',
password: '123456',
...overrides
});
В тесте:
const props = createUserForm({ password: 'abcdef' });
const wrapper = renderMount(UserForm, props);
Такой подход особенно удобен для компонентов с большим числом пропсов или сложной инициализацией.
Использование вспомогательных функций позволяет стандартизировать тесты:
В результате тестовая база становится более стабильной и масштабируемой, а новые тесты создаются быстрее и проще.