В Vue Test Utils обёртка компонента (Wrapper) — это объект, представляющий смонтированный Vue-компонент в тестовой среде. Обёртка инкапсулирует экземпляр компонента, его DOM-представление, реактивное состояние и предоставляет API для взаимодействия с компонентом так, как это происходит в реальном приложении.
Wrapper создаётся в момент монтирования компонента и становится центральной точкой всех тестовых операций: поиска элементов, изменения данных, эмуляции событий, проверки реакций и побочных эффектов.
Обёртка выполняет несколько ключевых функций:
documentWrapper не является просто ссылкой на DOM-узел. Это высокоуровневый интерфейс, связывающий Vue-экземпляр и его представление.
Основные способы создания обёртки:
import { mount, shallowMount } from '@vue/test-utils'
mount полностью монтирует компонент, включая все
дочерние компоненты.
const wrapper = mount(MyComponent)
Особенности:
shallowMount заменяет дочерние компоненты
заглушками.
const wrapper = shallowMount(MyComponent)
Особенности:
Выбор между mount и shallowMount напрямую
влияет на структуру и сложность обёртки.
Wrapper содержит несколько уровней доступа:
Пример:
wrapper.vm.count
wrapper.element.tagName
wrapper.html()
wrapper.vm предоставляет прямой доступ к данным,
computed-свойствам и методам компонента, но его использование должно
быть осознанным: тесты, основанные только на vm, теряют
связь с реальным пользовательским поведением.
Wrapper предоставляет мощный API для поиска узлов.
Возвращает DOMWrapper.
const button = wrapper.find('button')
Поддерживаются:
wrapper.find('.submit')
wrapper.find('[data-test="title"]')
const items = wrapper.findAll('li')
Возвращает коллекцию обёрток.
Для поиска дочерних компонентов:
wrapper.findComponent(ChildComponent)
или по имени:
wrapper.findComponent({ name: 'ChildComponent' })
В Vue Test Utils существуют разные типы обёрток:
DOMWrapper ограничен DOM-операциями:
button.text()
button.attributes()
button.classes()
VueWrapper расширяет возможности:
childWrapper.props()
childWrapper.emitted()
childWrapper.vm
Чёткое понимание типа обёртки предотвращает ошибки при вызове методов.
Wrapper позволяет эмулировать события так, как если бы они были вызваны пользователем.
await wrapper.find('button').trigger('click')
Поддерживаются параметры событий:
await input.trigger('keydown.enter')
await input.trigger('input', { target: { value: 'test' } })
trigger автоматически вызывает обработчики и учитывает
асинхронную реактивность Vue.
Изменение данных через Wrapper:
await wrapper.setData({ count: 5 })
Изменение props:
await wrapper.setProps({ title: 'New title' })
После таких операций обёртка обновляет DOM, но только после ожидания следующего тика.
await wrapper.vm.$nextTick()
Методы setData и setProps синхронизированы
с системой реактивности Vue и обеспечивают корректное обновление
состояния.
Wrapper аккумулирует все события, отправленные через
$emit.
wrapper.emitted()
Пример:
expect(wrapper.emitted('submit')).toBeTruthy()
expect(wrapper.emitted('submit')[0]).toEqual([{ value: 10 }])
Каждый вызов события сохраняется как массив аргументов, что делает проверку детальной и предсказуемой.
Слоты передаются при создании обёртки:
mount(MyComponent, {
slots: {
default: '<span>Content</span>'
}
})
Проверка:
expect(wrapper.html()).toContain('Content')
Wrapper корректно рендерит как обычные, так и scoped-слоты, предоставляя доступ к их DOM-представлению.
Wrapper может быть настроен через global:
mount(MyComponent, {
global: {
plugins: [store],
mocks: {
$t: () => 'translated'
},
stubs: {
RouterLink: true
}
}
})
Это позволяет:
Обёртка сохраняет эти настройки на протяжении всего теста.
После завершения теста обёртка может быть уничтожена:
wrapper.unmount()
Это особенно важно при тестировании компонентов с подписками, таймерами или глобальными эффектами.
wrapper.vmDOMWrapper и VueWrapper
APIКорректное использование обёртки позволяет строить устойчивые и поддерживаемые тесты, отражающие реальное поведение компонентов Vue.