Vue Test Utils (VTU) предоставляет мощные инструменты для тестирования компонентов Vue, включая возможность работы с виртуальным DOM и его визуализацию. Понимание того, как DOM компонента изменяется в процессе теста, является ключевым аспектом при проверке корректности поведения и рендеринга.
Основной метод для работы с DOM — функция mount. Она
создает полноценный экземпляр компонента и рендерит его в виртуальный
DOM. Пример базового монтирования:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
const wrapper = mount(MyComponent, {
props: { title: 'Тестовый заголовок' },
slots: { default: '<span>Контент слота</span>' }
});
Ключевые моменты:
wrapper — это объект, предоставляющий методы для
взаимодействия с DOM.props и slots позволяют настраивать
компонент под конкретные сценарии.После монтирования структура DOM доступна через
wrapper.html(), wrapper.text() и
wrapper.element. Например:
console.log(wrapper.html());
// <div><h1>Тестовый заголовок</h1><span>Контент слота</span></div>
Для поиска элементов в компоненте используются методы
find и findAll. Они позволяют визуализировать
и проверять состояние отдельных частей DOM.
const heading = wrapper.find('h1');
expect(heading.text()).toBe('Тестовый заголовок');
const spans = wrapper.findAll('span');
expect(spans).toHaveLength(1);
find возвращает первый найденный элемент, обернутый в
Wrapper.findAll возвращает массив Wrapper
объектов, что удобно для проверки повторяющихся элементов.Vue Test Utils автоматически обрабатывает реактивные изменения, но
иногда необходимо явно ожидать обновления DOM через
nextTick:
import { nextTick } from 'vue';
wrapper.setProps({ title: 'Новый заголовок' });
await nextTick();
expect(wrapper.find('h1').text()).toBe('Новый заголовок');
Важно понимать: любые изменения состояния компонента (props,
reactive, ref) отражаются в DOM только после обновления.
nextTick гарантирует, что виртуальный DOM синхронизирован с
текущим состоянием.
Методы trigger и setValue позволяют
эмулировать пользовательские действия и проверять результат в DOM:
const button = wrapper.find('button');
await button.trigger('click');
expect(wrapper.find('.message').text()).toBe('Кнопка нажата');
const input = wrapper.find('input');
await input.setValue('Vue Test Utils');
expect(wrapper.find('input').element.value).toBe('Vue Test Utils');
Особенности:
trigger активирует событие, которое может изменить DOM
или состояние компонента.setValue обновляет значение поля ввода и автоматически
триггерит событие input.Для более сложных компонентов удобным инструментом является использование снимков DOM. VTU совместим с Jest snapshot testing:
expect(wrapper.html()).toMatchSnapshot();
Снимок фиксирует визуальное состояние компонента в момент теста. Любые изменения DOM после рефакторинга будут выявлены как отличие от сохранённого снимка.
Методы findComponent и findAllComponents
позволяют работать с дочерними компонентами:
const child = wrapper.findComponent({ name: 'ChildComponent' });
expect(child.exists()).toBe(true);
expect(child.text()).toContain('Контент дочернего компонента');
Такой подход позволяет отслеживать визуальные изменения внутри сложных иерархий Vue-компонентов.
wrapper.html() для быстрого просмотра
структуры всего компонента.find/findAll с
text(), attributes() и classes()
для точной проверки элементов.nextTick после изменения props или состояния.Vue Test Utils использует виртуальный DOM, что позволяет тестам выполняться быстро и изолированно. Виртуальный DOM точно отражает структуру и состояние реального DOM без необходимости подключения браузера. Это дает следующие преимущества:
Работа с DOM через VTU обеспечивает полный контроль над визуальной составляющей компонентов и позволяет создавать тесты, точно отражающие взаимодействие пользователя с интерфейсом.