Библиотека AOS (Animate on Scroll) позволяет
добавлять анимацию элементов при прокрутке страницы. Для полноценного
unit-тестирования компонентов с AOS необходимо понимать, что библиотека
взаимодействует с DOM напрямую, добавляя атрибуты data-aos
и классы анимации, а также отслеживает события прокрутки для запуска
анимации.
Ключевые моменты при тестировании:
AOS.init() запускает
отслеживание DOM и регистрирует обработчики событий scroll и
resize.data-aos="animation-name" и опциональные
data-aos-delay, data-aos-duration..aos-animate после срабатывания анимации, что важно для
проверки корректности поведения компонента.Для unit-тестирования компонентов, использующих AOS, рекомендуется:
Изоляция DOM Каждый тест должен иметь собственный контейнер DOM, чтобы избежать влияния глобального состояния AOS:
beforeEach(() => {
document.body.innerHTML = `<div id="test-container"></div>`;
});Создание тестового элемента с AOS
const element = document.createElement('div');
element.setAttribute('data-aos', 'fade-up');
document.getElementById('test-container').appendChild(element);Инициализация AOS в тестах При каждом тесте
важно вызывать AOS.init() после добавления элементов в
DOM:
AOS.init({
disable: true // отключение реальной анимации для ускорения тестов
});Первый уровень тестирования — убедиться, что элемент имеет правильные атрибуты:
expect(element.getAttribute('data-aos')).toBe('fade-up');
expect(element.getAttribute('data-aos-delay')).toBeNull();
AOS добавляет классы .aos-animate после выполнения
анимации. Для unit-тестов можно вызвать вручную метод
AOS.refresh() или имитировать событие scroll:
AOS.refresh(); // пересчитывает позиции элементов
// имитация появления элемента в зоне видимости
element.classList.add('aos-init');
element.classList.add('aos-animate');
expect(element.classList.contains('aos-animate')).toBe(true);
duration — длительность анимации, проверяется через
атрибут:
element.setAttribute('data-aos-duration', '1200');
AOS.init();
expect(element.getAttribute('data-aos-duration')).toBe('1200');delay — задержка перед запуском:
element.setAttribute('data-aos-delay', '500');
expect(element.getAttribute('data-aos-delay')).toBe('500');offset — смещение для запуска анимации: проверяется
через конфигурацию и пересчёт позиций в
AOS.refresh().
Для unit-тестирования полезно использовать мокирование событий scroll и таймеров, чтобы не ждать реальной анимации:
jest.useFakeTimers();
// имитация прокрутки
window.dispatchEvent(new Event('scroll'));
// продвигаем таймеры вперед
jest.advanceTimersByTime(1000);
expect(element.classList.contains('aos-animate')).toBe(true);
Такой подход позволяет проверять поведение компонентов с анимацией без реального визуального отображения.
При использовании Jest, Vitest или Testing Library стоит учитывать:
useEffect с
вызовом AOS.init() внутри, а в тестах можно замокать
AOS:jest.mock('aos', () => ({
init: jest.fn(),
refresh: jest.fn()
}));
const animatedElement = screen.getByTestId('animated');
expect(animatedElement).toHaveClass('aos-animate');
Компоненты с динамическим контентом Элементы,
которые появляются после рендера, требуют повторного вызова
AOS.refresh().
Компоненты с разными эффектами анимации Для
каждого data-aos нужно убедиться, что атрибут корректно
применяется и класс aos-animate добавляется.
Тестирование с отключенной анимацией
AOS.init({ disable: true }) полезно для ускорения тестов
без визуальной анимации.
AOS.init() и AOS.refresh() после
изменения DOM.data-aos, так и классы
.aos-animate.AOS.refresh()
после добавления элементов.Эти подходы обеспечивают надёжное unit-тестирование компонентов с анимациями на основе AOS, позволяя проверять корректность работы анимаций и интеграцию с DOM без визуального рендеринга.