Snapshot тесты — это важная часть тестирования компонентов в React-приложениях. Суть таких тестов заключается в сохранении текущего состояния компонента и его последующей проверке на изменения. Когда компонент рендерится, его HTML-разметка, стили и атрибуты сохраняются в виде “снимка” (snapshot). В дальнейшем этот снимок сравнивается с тем, что компонент отрендерит при следующем запуске теста. Если разметка изменится, тест зафейлится, что поможет выявить неожиданные изменения в интерфейсе.
Snapshot тесты, как правило, выполняются с использованием библиотеки Jest, которая включает встроенную поддержку для работы с ними. Взаимодействие с компонентами React происходит следующим образом:
Это позволяет выявлять непреднамеренные изменения в пользовательском интерфейсе и повышать стабильность кода.
Для использования snapshot тестов с Enzyme и Jest необходимо выполнить несколько шагов:
Установка зависимостей: Для начала нужно
установить библиотеки jest, enzyme и
enzyme-adapter-react-16, а также дополнительные утилиты для
работы с snapshot тестами, например, enzyme-to-json:
npm install --save-dev jest enzyme enzyme-adapter-react-16 enzyme-to-jsonНастройка Enzyme: В файле конфигурации тестов
(обычно setupTests.js) настраивается адаптер Enzyme, чтобы
он мог работать с React 16:
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });Создание snapshot теста: Далее необходимо
написать сам тест. Для этого компоненты рендерятся с помощью Enzyme, а
затем полученная разметка передается в метод
toMatchSnapshot() Jest:
import React from 'react';
import { shallow } from 'enzyme';
import MyComponent from './MyComponent';
test('MyComponent renders correctly', () => {
const wrapper = shallow(<MyComponent />);
expect(wrapper).toMatchSnapshot();
});
В данном примере Enzyme используется для рендеринга компонента
MyComponent с использованием метода shallow,
который создает “мелкое” рендеринг без учета вложенных компонентов.
Затем вызывается метод toMatchSnapshot(), который создает
или сравнивает snapshot для компонента.
Первоначальное создание снимка: При первом
запуске теста Jest автоматически создает файл снимка (обычно в
директории __snapshots__). Этот файл содержит HTML-разметку
компонента на момент первого теста.
Если после изменений в компоненте или в его окружении необходима актуализация снимка, это можно сделать вручную или автоматически:
Автоматическое обновление снимков: Для обновления снимков, если изменения в UI ожидаемы, достаточно запустить команду:
npm test -- -u
Это приведет к тому, что Jest пересоздаст все снимки и обновит их для всех компонентов, где произошли изменения.
Ручное обновление снимков: Иногда необходимо вручную проверить изменения, прежде чем обновить снимки. Jest предоставляет возможность просматривать diff между старым и новым снимками, что позволяет убедиться в том, что изменения корректны.
Snapshot тесты являются мощным инструментом для проверки UI компонентов в React-приложениях. Они помогают отслеживать непреднамеренные изменения в разметке и гарантировать, что интерфейс остается стабильным и предсказуемым. Несмотря на свою простоту, эти тесты требуют внимательного подхода к обновлениям снимков и их правильной интерпретации. В сочетании с другими типами тестов, snapshot тесты обеспечивают более надежную разработку и поддержку качественного кода.