В тестировании компонентов Vue одним из ключевых инструментов является снимок (snapshot). Снимки позволяют фиксировать текущую структуру разметки компонента и автоматически проверять, что последующие изменения кода не нарушают ожидаемое поведение. Иногда возникает необходимость обновить снимок, чтобы он соответствовал новым требованиям или изменениям интерфейса.
Vue Test Utils в связке с Jest использует механизм сериализации
компонента в строку HTML. При первом запуске теста создаётся файл
снимка, например Component.spec.js.snap, который содержит
сериализованное представление DOM компонента. Каждый последующий запуск
сравнивает актуальный DOM с сохранённым снимком:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
test('рендерится корректно', () => {
const wrapper = mount(MyComponent);
expect(wrapper.html()).toMatchSnapshot();
});
Если компонент изменился, Jest отмечает тест как failed, указывая, что текущий DOM не совпадает со снимком. Это нормальный процесс — снимок фиксирует именно текущее состояние компонента.
Снимок нужно обновлять в случаях:
Обновление позволяет тесту корректно отражать намеренные изменения, сохраняя защиту от непреднамеренных регрессий.
1. Ручное обновление через Jest CLI
Для обновления всех снимков достаточно выполнить команду:
jest -u
или с полным названием:
npm run test -- -u
Флаг -u (--updateSnapshot) сообщает Jest
перезаписать все снимки, которые не совпадают с текущим выводом
компонентов.
2. Обновление отдельного снимка
Можно использовать режим интерактивного запуска Jest с клавишей
u. При запуске тестов Jest предложит:
Press `u` to update failing snapshots
Нажатие u обновляет только те снимки, которые были
отмечены как несоответствующие.
3. Программное управление
Если требуется обновлять снимки программно, можно использовать API Jest:
expect(wrapper.html()).toMatchSnapshot({ updateSnapshot: true });
Однако чаще используют CLI-методы, так как они более прозрачны и позволяют контролировать процесс централизованно.
Vue Test Utils предоставляет дополнительные возможности для контроля над снимками:
wrapper.setProps и wrapper.setSlots можно
проверить, как изменяется HTML при различных входных данных и обновлять
снимки для каждого варианта.trigger) и делать снимки после них:wrapper.find('button').trigger('click');
expect(wrapper.html()).toMatchSnapshot();
expect(wrapper.find('.header').html()).toMatchSnapshot();
В проектах с сотнями компонентов часто используют стратегию:
Эта стратегия помогает поддерживать снимки в актуальном состоянии и предотвращает ложные срабатывания тестов.
Обновление снимков — это процесс контроля за тем, что DOM компонента соответствует ожидаемому виду. Оно требует внимательности, проверки изменений и разумного использования инструментов Jest и Vue Test Utils. Снимки должны фиксировать значимые изменения интерфейса, но не становиться источником автоматических ошибок из-за динамичных данных или несущественных изменений.