Snapshot тестирование — это метод автоматической проверки интерфейсов, который фиксирует текущее состояние компонента в момент теста и сравнивает его с ранее сохранённым «снимком». В контексте библиотеки Naive UI это особенно полезно, поскольку она предоставляет большое количество визуально и функционально сложных компонентов, таких как таблицы, формы и модальные окна.
Для snapshot тестирования с Naive UI чаще всего используют Jest вместе с Vue Test Utils:
npm install --save-dev @vue/test-utils jest babel-jest vue-jest
В package.json необходимо добавить конфигурацию для
Jest:
"jest": {
"moduleFileExtensions": ["js", "vue"],
"transform": {
"^.+\\.vue$": "vue-jest",
"^.+\\.js$": "babel-jest"
},
"snapshotSerializers": ["jest-serializer-vue"]
}
Использование jest-serializer-vue позволяет сохранять
виртуальный DOM Vue-компонентов в удобочитаемом виде.
В Naive UI многие компоненты имеют сложные внутренние состояния. Для тестирования необходимо корректно инициализировать все props и slots:
import { mount } from '@vue/test-utils';
import { NButton } from 'naive-ui';
test('NButton snapshot', () => {
const wrapper = mount(NButton, {
props: { type: 'primary', size: 'large' },
slots: { default: 'Нажми меня' }
});
expect(wrapper.html()).toMatchSnapshot();
});
props задают состояние компонента.slots позволяют проверить отображение вложенного
контента.wrapper.html() возвращает строковое представление DOM,
которое сравнивается с snapshot.Для компонентов вроде NDataTable или
NSelect важно проверять не только рендеринг, но и реакцию
на пользовательские события:
import { mount } from '@vue/test-utils';
import { NDataTable } from 'naive-ui';
const columns = [{ title: 'Имя', key: 'name' }];
const data = [{ name: 'Иван' }];
test('NDataTable snapshot', async () => {
const wrapper = mount(NDataTable, {
props: { columns, data }
});
// Проверка начального рендеринга
expect(wrapper.html()).toMatchSnapshot();
// Эмуляция событий
await wrapper.setProps({ data: [{ name: 'Пётр' }] });
expect(wrapper.html()).toMatchSnapshot();
});
Это гарантирует, что изменения данных не нарушают визуальную структуру таблицы.
flushPromises или nextTick перед снятием
snapshot, чтобы дождаться полной загрузки состояния.jest --updateSnapshot только при уверенности, что изменения
интерфейса преднамеренные.Snapshot тесты легко интегрируются в CI/CD:
Naive UI использует собственную систему стилей и динамических классов. При snapshot тестировании необходимо учитывать:
active,
disabled, hover) могут влиять на
HTML-вывод.light,
dark) могут менять структуру классов, поэтому тесты должны
фиксировать тему или использовать единообразный контекст.NModal или
NPopover рендерят контент вне основного DOM. Для
корректного snapshot теста требуется монтировать с
attachTo: document.body.mount(NModal, { props: { show: true }, attachTo: document.body });
Это гарантирует, что визуальная структура модального окна будет захвачена полностью.
Snapshot тестирование является критически важным инструментом при работе с Naive UI, позволяя поддерживать стабильность интерфейса и ускорять процесс разработки сложных Vue-приложений.