Shepherd.js — это библиотека для создания интерактивных пошаговых руководств в веб-приложениях. Одной из ключевых особенностей является система событий, позволяющая отслеживать поведение тура, шагов и взаимодействие пользователя. Правильное тестирование этих событий критически важно для обеспечения корректного функционирования интерфейса и последовательности шагов.
Shepherd.js предоставляет события на уровне тура и на уровне отдельных шагов:
На уровне тура:
start — срабатывает при запуске тура.complete — возникает при успешном завершении тура.cancel — срабатывает при принудительной отмене
тура.show — срабатывает при отображении любого шага.hide — срабатывает при скрытии шага.inactive — возникает при деактивации тура (например,
пользователь покинул страницу).На уровне шага:
show — шаг стал видимым.hide — шаг скрыт.complete — шаг успешно пройден.cancel — шаг отменён.active — шаг активирован.Shepherd.js использует паттерн EventEmitter, что
позволяет подписываться на события через метод on. Пример
подключения событий к туру:
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: {
enabled: true
},
scrollTo: { beh * avior: 'smooth', block: 'center' }
}
});
tour.on('start', () => {
console.log('Тур запущен');
});
tour.on('complete', () => {
console.log('Тур завершён');
});
tour.on('cancel', () => {
console.log('Тур отменён');
});
Для шагов события подключаются аналогично:
const step = tour.addStep({
id: 'intro',
text: 'Добро пожаловать!',
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
step.on('show', () => console.log('Шаг показан'));
step.on('hide', () => console.log('Шаг скрыт'));
При тестировании важно убедиться, что события срабатывают в правильной последовательности. Обычно используют автоматизированные тесты с фреймворками типа Jest или Cypress.
Пример проверки последовательности событий в Jest:
test('Тур вызывает события в правильной последовательности', () => {
const events = [];
tour.on('start', () => events.push('start'));
tour.on('show', () => events.push('show'));
tour.on('complete', () => events.push('complete'));
tour.start();
tour.next(); // Переход к следующему шагу
tour.complete();
expect(events).toEqual(['start', 'show', 'complete']);
});
Shepherd.js позволяет реагировать на нажатия кнопок и другие действия
пользователя через методы action. Для тестирования можно
эмулировать клики и проверять срабатывание событий:
const step = tour.addStep({
id: 'action-step',
text: 'Нажмите кнопку',
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
const button = document.querySelector('.shepherd-button');
button.click();
step.on('hide', () => console.log('Шаг скрыт после клика'));
Эмуляция действий полезна для тестирования автоматизации, особенно при проверке интеграции тура с реальными компонентами интерфейса.
Некоторые события могут зависеть от асинхронных действий, например, загрузки данных или анимации. В таких случаях тесты должны ожидать завершения этих действий:
tour.on('show', async () => {
await fetchData();
console.log('Данные загружены, шаг показан');
});
При тестировании используют async/await или таймеры Jest
(jest.useFakeTimers) для контроля времени и
последовательности.
Shepherd.js позволяет добавлять пользовательские обработчики событий. Для тестирования важно убедиться, что они вызываются корректно и не нарушают логику тура:
step.on('show', () => {
customFunction();
});
function customFunction() {
console.log('Выполняется кастомная логика');
}
В автоматизированных тестах проверяют вызов функции через
jest.fn():
const spy = jest.fn();
step.on('show', spy);
tour.start();
expect(spy).toHaveBeenCalled();
Для комплексных туров рекомендуется включать логирование событий. Это позволяет отслеживать последовательность шагов и выявлять ошибки:
tour.steps.forEach(step => {
step.on('show', () => console.log(`Показан шаг: ${step.id}`));
step.on('hide', () => console.log(`Скрыт шаг: ${step.id}`));
});
show,
hide, complete), так и пользовательские
обработчики.Эта методология позволяет строить надежные и воспроизводимые тесты для интерактивных туров, гарантируя, что все события срабатывают в нужный момент и логика взаимодействия пользователя с интерфейсом остаётся корректной.