Снимки (snapshots) являются важным инструментом в тестировании компонентов React. Они позволяют фиксировать структуру компонента на момент тестирования, чтобы в дальнейшем сравнивать её с будущими версиями. Это помогает отслеживать изменения в интерфейсе и убедиться, что они были намеренными. В контексте тестирования с помощью Enzyme создание снимков используется вместе с Jest для эффективной проверки рендеринга React-компонентов.
Enzyme — это утилита для тестирования React-компонентов, которая облегчает манипуляции с компонентами и проверку их состояния. Jest, в свою очередь, предоставляет функциональность для создания снимков и их последующего сравнения. Эти инструменты можно использовать вместе для улучшения процесса тестирования и контроля изменений интерфейса.
Для работы с Enzyme и Jest необходимо установить несколько пакетов:
npm install --save enzyme jest enzyme-adapter-react-16 react-test-renderer
Здесь enzyme-adapter-react-16 — это адаптер, который
позволяет Enzyme взаимодействовать с React 16. Также потребуется
react-test-renderer, который используется для рендеринга
компонентов React в тестах.
После установки зависимостей необходимо настроить Jest для работы с Enzyme. Для этого создается файл конфигурации, где указывается адаптер Enzyme:
// setupTests.js
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
Этот файл должен быть указан в конфигурации Jest в разделе
setupFilesAfterEnv в файле jest.config.js:
module.exports = {
setupFilesAfterEnv: ['./src/setupTests.js'],
};
После настройки можно приступать к тестированию.
react-test-rendererОсновной инструмент для создания снимков — это метод
toMatchSnapshot(), который предоставляется Jest. Этот метод
позволяет создавать снимок рендеринга компонента и сохранять его в файл
для дальнейшего сравнения.
Пример теста с использованием Enzyme и создания снимка:
import React from 'react';
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('matches the snapshot', () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper).toMatchSnapshot();
});
});
В этом примере:
shallow(), который
создает поверхностный рендеринг компонента
MyComponent.toMatchSnapshot() сравнивает текущую структуру
компонента с ранее сохраненным снимком. Если снимок ещё не существует,
Jest автоматически создает его в директории __snapshots__
рядом с тестом.При первом запуске теста с toMatchSnapshot() Jest
создаёт файл снимка в директории __snapshots__. Снимок
представляет собой сериализованное состояние компонента, включая
структуру и все его элементы.
При последующих запусках Jest сравнивает рендеринг компонента с ранее сохраненным снимком. Если структура компонента изменилась, Jest сообщит о несоответствии и предложит обновить снимок, если изменения были намеренными.
Если изменения в компоненте были преднамеренными, снимок можно
обновить. Это делается с помощью флага -u (или
--updateSnapshot) при запуске тестов:
npm test -- -u
После этого Jest обновит снимки и сохранит новые данные в соответствующих файлах.
mount() для глубокого рендерингаEnzyme предоставляет несколько методов для рендеринга компонентов:
shallow(), mount() и render(). В
случае, если нужно протестировать компонент в полном рендере, включая
все дочерние компоненты и состояние, используется метод
mount().
Пример использования mount() для создания снимка:
import React from 'react';
import { mount } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('matches the snapshot', () => {
const wrapper = mount(<MyComponent />);
expect(wrapper).toMatchSnapshot();
});
});
Метод mount() выполняет полный рендеринг компонента,
включая его детей, что делает его более ресурсоемким, чем
shallow(). Однако он полезен, когда необходимо проверить
поведение компонента в контексте его полного окружения.
В некоторых случаях компоненты могут использовать внутреннее состояние или контекст. Для таких компонентов может потребоваться манипуляция состоянием при создании снимков. Enzyme предоставляет методы для управления состоянием компонента.
Пример:
import React from 'react';
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
it('matches the snapshot after state change', () => {
const wrapper = shallow(<MyComponent />);
wrapper.setState({ someState: 'new value' });
expect(wrapper).toMatchSnapshot();
});
});
Здесь с помощью setState() изменяется состояние
компонента, и затем создается снимок с обновленным состоянием.
Многие компоненты React могут зависеть от асинхронных операций, таких как запросы к серверу. В таких случаях важно дождаться завершения всех асинхронных операций перед созданием снимка. Jest и Enzyme позволяют использовать асинхронные методы для решения этой задачи.
Пример:
import React from 'react';
import { mount } from 'enzyme';
import MyAsyncComponent from './MyAsyncComponent';
describe('MyAsyncComponent', () => {
it('matches the snapshot after data fetch', async () => {
const wrapper = mount(<MyAsyncComponent />);
await wrapper.instance().fetchData(); // асинхронный метод компонента
wrapper.update(); // обновляем компонент после завершения асинхронной операции
expect(wrapper).toMatchSnapshot();
});
});
В этом примере используется метод fetchData(), который
является асинхронным. После завершения асинхронной операции вызывается
update(), чтобы отобразить изменения в компоненте, и затем
создается снимок.
Снимки играют важную роль в поддержке качества кода и в отслеживании изменений интерфейса. Они позволяют на раннем этапе обнаружить непреднамеренные изменения в компонентах, которые могут повлиять на пользовательский интерфейс. Однако важно помнить, что снимки следует использовать с умом, чтобы избежать чрезмерного обновления снимков, что может привести к потерям в тестировании.
Снимки должны быть обновлены только в случае преднамеренных изменений в интерфейсе, например, после рефакторинга или добавления новых функций. Если снимок обновляется без должной необходимости, это может снизить полезность этой практики.
Таким образом, создание снимков в Enzyme является мощным инструментом для упрощения процесса тестирования React-компонентов. Однако для эффективного использования этой практики важно следить за актуальностью снимков и не полагаться на них как на единственный способ тестирования.