Снэпшот-тестирование представляет собой метод проверки корректности визуального и структурного состояния веб-компонентов, создаваемых с помощью SkateJS. Основная цель — фиксировать «снимок» DOM-компонента в определённый момент и сравнивать его с эталонной версией при последующих изменениях кода. Это позволяет быстро выявлять нежелательные изменения в разметке, стилях или поведении компонентов.
Для снэпшот-тестирования компонентов SkateJS часто используют Jest в связке с инструментами для рендеринга виртуального DOM, например @testing-library/dom или @web/test-runner. Основные шаги настройки:
npm install --save-dev jest @testing-library/dom @testing-library/jest-dom
package.json или
отдельном файле jest.config.js задаётся среда
jsdom для имитации браузера:module.exports = {
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['@testing-library/jest-dom/extend-expect'],
};
customElements.define или функцию define() из
SkateJS, чтобы тестовый рендеринг корректно их обрабатывал.Пример простого компонента с SkateJS:
import { define, component, h } from 'skatejs';
class MyButton extends component() {
static get props() {
return {
label: String
};
}
render() {
return h('button', null, this.label);
}
}
define('my-button', MyButton);
Такой компонент готов для снэпшот-тестирования: DOM-структура предсказуема, легко фиксируется и сравнивается.
Снэпшот-тест состоит из трёх этапов:
Пример теста с Jest:
import { render } from '@testing-library/dom';
import './MyButton';
test('MyButton snapshot', () => {
const container = document.createElement('div');
document.body.appendChild(container);
const button = document.createElement('my-button');
button.label = 'Click me';
container.appendChild(button);
expect(container.innerHTML).toMatchSnapshot();
});
В этом примере:
container.innerHTML захватывает текущую разметку
компонента.toMatchSnapshot() сравнивает её с ранее сохранённым
снэпшотом.Снэпшот-тесты не ограничиваются статическим рендерингом. SkateJS поддерживает реактивные свойства, что позволяет тестировать динамическое поведение:
test('MyButton updates label', () => {
const button = document.createElement('my-button');
button.label = 'Start';
document.body.appendChild(button);
expect(button).toMatchSnapshot();
button.label = 'Stop';
expect(button).toMatchSnapshot();
});
Таким образом фиксируются изменения DOM при обновлении свойств компонента.
Для крупных проектов рекомендуется:
ComponentName.test.js.__snapshots__, автоматически
создаваемой Jest.afterEach(() => {
document.body.innerHTML = '';
});
Это предотвращает влияние предыдущих тестов на последующие проверки.
Компоненты SkateJS часто используют Shadow DOM. Для снэпшот-тестирования важно правильно захватывать его содержимое:
test('MyButton shadow DOM', () => {
const button = document.createElement('my-button');
document.body.appendChild(button);
expect(button.shadowRoot.innerHTML).toMatchSnapshot();
});
Такой подход позволяет проверять внутреннюю структуру компонента без вмешательства в глобальный DOM.
Снэпшот-тесты удобно интегрируются в pipeline CI/CD:
jest --updateSnapshot
Снэпшот-тестирование в SkateJS обеспечивает надёжную проверку визуальной и структурной целостности веб-компонентов, особенно в сочетании с Shadow DOM и реактивными свойствами. Оно помогает поддерживать стабильность интерфейсов и упрощает работу с крупными проектами.