Тестирование адаптивности интерфейсов в Vue-компонентах играет критическую роль в поддержании качественного пользовательского опыта на разных устройствах и разрешениях экранов. Vue Test Utils предоставляет инструменты для изоляции компонентов и проверки их поведения под различными условиями отображения.
Для работы с Vue Test Utils необходимы следующие зависимости:
npm install @vue/test-utils jest vue-jest jsdom
jsdom имитирует браузерное окружение, что позволяет
тестировать реакцию компонентов на изменение размеров окна и
медиазапросов.
Конфигурация Jest может включать настройку глобальных свойств для эмуляции размеров окна:
global.innerWidth = 1024;
global.innerHeight = 768;
window.resizeTo = (width, height) => {
global.innerWidth = width;
global.innerHeight = height;
window.dispatchEvent(new Event('resize'));
};
Это позволяет программно изменять размеры окна и проверять адаптивное поведение компонентов.
v-if, v-show
или динамические классы для адаптации под различные размеры. Проверка
заключается в том, чтобы изменить размеры окна и убедиться, что
отображение элементов соответствует ожиданиям:import { mount } from '@vue/test-utils';
import ResponsiveComponent from '@/components/ResponsiveComponent.vue';
test('показывает мобильное меню при малой ширине', async () => {
window.resizeTo(480, 800);
const wrapper = mount(ResponsiveComponent);
expect(wrapper.find('.mobile-menu').exists()).toBe(true);
expect(wrapper.find('.desktop-menu').exists()).toBe(false);
});
computed свойства или watch для
отслеживания размеров экрана, важно проверять правильное обновление
значений при изменении window.innerWidth:test('computed-свойство корректно обновляется при изменении окна', async () => {
const wrapper = mount(ResponsiveComponent);
window.resizeTo(320, 600);
await wrapper.vm.$nextTick();
expect(wrapper.vm.isMobile).toBe(true);
window.resizeTo(1024, 768);
await wrapper.vm.$nextTick();
expect(wrapper.vm.isMobile).toBe(false);
});
window.getComputedStyle и
имитации событий resize. Пример:test('класс адаптивного блока корректно применяется', () => {
window.resizeTo(500, 700);
const wrapper = mount(ResponsiveComponent);
const block = wrapper.find('.adaptive-block').element;
const style = window.getComputedStyle(block);
expect(style.display).toBe('block'); // предполагаемое поведение для мобильной версии
});
mobile, tablet,
desktop) помогает гарантировать предсказуемость
поведения.import { mount } from '@vue/test-utils';
import AdaptiveLayout from '@/components/AdaptiveLayout.vue';
test('snapshot мобильной версии', () => {
window.resizeTo(375, 667);
const wrapper = mount(AdaptiveLayout);
expect(wrapper.html()).toMatchSnapshot();
});
При использовании Composition API можно отслеживать размеры через реактивные переменные:
import { ref, onMounted, onUnmounted } from 'vue';
export default {
setup() {
const width = ref(window.innerWidth);
const handleResize = () => {
width.value = window.innerWidth;
};
onMounted(() => window.addEventListener('resize', handleResize));
onUnmounted(() => window.removeEventListener('resize', handleResize));
return { width, isMobile: computed(() => width.value < 768) };
}
};
В тестах для такого подхода важно триггерить событие
resize и ждать обновления реактивных данных через
await wrapper.vm.$nextTick().
Сложные компоненты могут сочетать медиазапросы, динамические классы и условный рендеринг. Тестирование должно учитывать все комбинации, чтобы исключить визуальные или функциональные баги на различных устройствах:
const sizes = [
{ width: 375, expectedMobile: true },
{ width: 768, expectedMobile: false },
{ width: 1024, expectedMobile: false }
];
sizes.forEach(({ width, expectedMobile }) => {
test(`адаптивное состояние для ширины ${width}`, async () => {
window.resizeTo(width, 800);
const wrapper = mount(ResponsiveComponent);
await wrapper.vm.$nextTick();
expect(wrapper.vm.isMobile).toBe(expectedMobile);
});
});
Такой подход обеспечивает покрытие всех критических сценариев и позволяет выявить скрытые ошибки адаптивной верстки.
jsdom ограничена и не полностью
повторяет поведение реального браузера, поэтому для критичных проектов
рекомендуется дополнительно использовать визуальное тестирование в
реальном окружении (например, Cypress с тестами на разные
разрешения).