Моки (mocks) и стабы (stubs) — это инструменты для имитации поведения объектов или функций в процессе тестирования и разработки интерактивных интерфейсов. В контексте библиотеки Shopify Draggable они помогают отделить логику перетаскивания элементов от реального DOM, что упрощает проверку сценариев drag-and-drop.
Моки позволяют создавать объекты, которые ведут себя как настоящие
элементы Draggable, но не требуют реального DOM. Это особенно полезно
для юнит-тестов, где нужно проверить события drag:start,
drag:move и drag:stop.
import { Draggable } from '@shopify/draggable';
const mockContainer = document.createElement('div');
const mockItem = document.createElement('div');
mockContainer.appendChild(mockItem);
const draggable = new Draggable(mockContainer, {
draggable: 'div'
});
// Подключение обработчика с мок-данными
draggable.on('drag:start', (event) => {
console.log('Начало перетаскивания', event.source);
});
// Имитируем событие drag:start вручную
const mockEvent = {
source: mockItem,
sensorEvent: null,
};
draggable.trigger('drag:start', mockEvent);
Ключевые моменты использования моков:
Стаб — это объект или функция, которая заменяет оригинальный метод
для контроля возвращаемых значений. В Draggable это удобно при
тестировании колбэков или при работе с асинхронными операциями,
например, при обновлении состояния после drag:stop.
import { Draggable } from '@shopify/draggable';
// Стаб функции, которая должна возвращать новые позиции элементов
const getNewPosition = jest.fn().mockReturnValue({ x: 100, y: 200 });
const draggable = new Draggable(document.querySelectorAll('.list'), {
draggable: '.item'
});
draggable.on('drag:stop', (event) => {
const newPosition = getNewPosition(event.source);
console.log(newPosition);
});
// Проверка вызова стаба
draggable.trigger('drag:stop', { source: document.querySelector('.item') });
console.log(getNewPosition.mock.calls.length); // 1
Особенности стаба:
Для комплексного тестирования интерфейса перетаскивания рекомендуется сочетать оба подхода:
drag:start, drag:move и
drag:stop.draggable.trigger('event', mockEvent) для эмуляции
пользовательских действий.Пример комплексного теста:
import { Draggable } from '@shopify/draggable';
import { jest } from '@jest/globals';
const container = document.createElement('div');
const item = document.createElement('div');
container.appendChild(item);
const draggable = new Draggable(container, { draggable: 'div' });
const positionStub = jest.fn().mockReturnValue({ x: 50, y: 75 });
draggable.on('drag:stop', (event) => {
const pos = positionStub(event.source);
item.style.transform = `translate(${pos.x}px, ${pos.y}px)`;
});
// Мок события drag
const mockEvent = { source: item, sensorEvent: null };
draggable.trigger('drag:stop', mockEvent);
console.assert(positionStub.mock.calls.length === 1, 'Стаб должен быть вызван один раз');
console.assert(item.style.transform === 'translate(50px, 75px)', 'Позиция элемента должна обновиться');
Моки и стабы становятся критически важными при создании надёжных и быстрых тестов для интерфейсов drag-and-drop, позволяя имитировать поведение пользователя и предсказывать результаты без полного рендеринга страницы.