Snapshot тестирование — это методика проверки компонентов на неизменность их визуального и функционального представления. Она особенно полезна при работе с компонентами Vue.js, позволяя быстро выявлять непреднамеренные изменения в интерфейсе после правок кода.
Snapshot — это «моментальный снимок» состояния компонента. При первом запуске теста фреймворк создает файл со структурой и содержимым компонента, который сохраняется на диске. В последующих тестах текущая реализация компонента сравнивается с этим снимком:
Snapshot тесты обычно используют вместе с инструментами Jest и Vue Test Utils.
Для работы с snapshot тестами в проекте Vue.js требуется:
npm install --save-dev jest @vue/test-utils vue-jest babel-jest
jest.config.js:module.exports = {
moduleFileExtensions: ['js', 'json', 'vue'],
transform: {
'^.+\\.vue$': 'vue-jest',
'^.+\\.js$': 'babel-jest'
},
testMatch: ['**/__tests__/**/*.spec.js'],
};
Пример теста для компонента Button.vue:
import { shallowMount } from '@vue/test-utils';
import Button from '@/components/Button.vue';
describe('Button.vue', () => {
it('соответствует snapshot', () => {
const wrapper = shallowMount(Button, {
props: { label: 'Нажми меня' }
});
expect(wrapper.html()).toMatchSnapshot();
});
});
Разбор ключевых моментов:
shallowMount создает поверхностный рендеринг компонента
без рендеринга дочерних компонентов.wrapper.html() возвращает HTML-разметку
компонента.toMatchSnapshot() сравнивает текущий HTML с сохраненным
snapshot.При изменении компонента необходимо обновить snapshot. Это делается командой:
jest -u
или
npm test -- -u
Обновление snapshot фиксирует изменения как корректные, предотвращая ложные срабатывания тестов.
Snapshot тесты можно комбинировать с состоянием Vuex и маршрутизацией:
import { shallowMount, createLocalVue } from '@vue/test-utils';
import Vuex from 'vuex';
import MyComponent from '@/components/MyComponent.vue';
const localVue = createLocalVue();
localVue.use(Vuex);
describe('MyComponent.vue', () => {
let store;
beforeEach(() => {
store = new Vuex.Store({
state: { count: 10 },
getters: { doubleCount: state => state.count * 2 }
});
});
it('соответствует snapshot с Vuex', () => {
const wrapper = shallowMount(MyComponent, { store, localVue });
expect(wrapper.html()).toMatchSnapshot();
});
});
Такой подход позволяет тестировать компоненты в контексте состояния приложения, сохраняя точность snapshot.
Snapshot тестирование в Vue.js обеспечивает стабильность интерфейса и ускоряет выявление ошибок, минимизируя риск непреднамеренных изменений при масштабной разработке.