E2E (End-to-End) тестирование направлено на проверку работы интерфейса в условиях, максимально приближенных к реальному использованию. Для приложений на Gridstack.js это особенно важно, поскольку библиотека управляет интерактивными сетками и виджетами, поддерживая динамическое перемещение и изменение размеров элементов.
Gridstack.js использует контейнер с сеткой
(grid), внутри которого располагаются виджеты
(widgets). E2E-тестирование должно проверять:
Для тестирования взаимодействий чаще всего применяются фреймворки Cypress, Playwright или Selenium, которые позволяют эмулировать действия пользователя и наблюдать изменения DOM.
import { GridStack } from 'gridstack';
import 'gridstack/dist/gridstack.css';
const grid = GridStack.init({ staticGrid: false });
grid.addWidget('<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="2"><div class="grid-stack-item-content">Widget 1</div></div>');
<div class="grid-stack"></div>;Gridstack.js реализует drag через Interact.js, поэтому при E2E-тестировании важно имитировать последовательность событий:
mousedown на заголовке виджета;mousemove с координатами новой позиции;mouseup для завершения перемещения.Пример для Cypress:
cy.get('.grid-stack-item').first()
.trigger('mousedown', { button: 0, clientX: 50, clientY: 50 })
.trigger('mousemove', { clientX: 150, clientY: 150 })
.trigger('mouseup');
Ключевой момент: проверка после drag должна включать
не только изменение координат виджета, но и его положения в сетке
(data-gs-x, data-gs-y).
Resize также требует эмуляции пользовательских событий:
mousedown на краю виджета (handle);mousemove с новыми размерами;mouseup для подтверждения.Пример:
cy.get('.grid-stack-item .ui-resizable-se').first()
.trigger('mousedown', { button: 0, clientX: 200, clientY: 200 })
.trigger('mousemove', { clientX: 300, clientY: 300 })
.trigger('mouseup');
После изменения размеров проверяется data-gs-width и
data-gs-height.
Gridstack.js генерирует ряд событий, которые критично тестировать:
change — вызывается при изменении положения или
размеров виджетов;added / removed — при добавлении или
удалении элементов;dragstart / dragstop и
resizestart / resizestop — для проверки
корректного начала и завершения взаимодействий.Пример проверки события в Cypress:
cy.window().then(win => {
cy.spy(win.grid, 'on').withArgs('change');
});
Взаимодействие с DOM и обработка событий в Gridstack.js происходит асинхронно. В E2E-тестах важно учитывать задержку:
cy.wait() или проверять
состояние через .should() для ожидания обновления DOM;Gridstack.js позволяет сериализовать сетку через
grid.save() и восстанавливать её через
grid.load(). В E2E-тестах проверяются:
Пример:
cy.window().then(win => {
const state = win.grid.save();
expect(state).to.have.length(1);
expect(state[0].x).to.equal(1);
});
Gridstack.js поддерживает responsive layout:
cy.viewport(1024, 768); // desktop
cy.viewport(375, 667); // mobile
После каждого изменения проверяется корректность позиционирования виджетов.
E2E-тестирование Gridstack.js фокусируется на симуляции реальных пользовательских действий и проверке корректной работы интерактивных виджетов, сохраняя последовательность и предсказуемость поведения сетки.