В Vue Test Utils функции mount и
shallowMount являются базовыми инструментами для изоляции и
анализа компонентов. Обе функции создают обёртку (Wrapper)
вокруг Vue-компонента, но принципиально различаются глубиной рендеринга
и степенью вовлечённости дочерних компонентов. Понимание этой разницы
определяет архитектуру тестов, их производительность и устойчивость к
изменениям кода.
mount: полный рендеринг компонентаmount создаёт полноценный экземпляр компонента вместе со
всеми вложенными дочерними компонентами. Происходит реальный рендер
шаблона, выполнение хуков жизненного цикла и инициализация
реактивности.
import { mount } from '@vue/test-utils'
import ParentComponent from '@/components/ParentComponent.vue'
const wrapper = mount(ParentComponent)
mounted, watch,
computed).Такой подход приближен к интеграционному тестированию на уровне компонентов и позволяет проверять взаимодействие между ними без дополнительной конфигурации.
shallowMount: поверхностный рендерингshallowMount создаёт компонент в изолированном виде,
автоматически подменяя все дочерние компоненты заглушками (stubs).
import { shallowMount } from '@vue/test-utils'
import ParentComponent from '@/components/ParentComponent.vue'
const wrapper = shallowMount(ParentComponent)
Каждый вложенный компонент заменяется минимальной реализацией вида:
<child-component-stub></child-component-stub>
При этом:
mount и
shallowMount| Характеристика | mount | shallowMount |
|---|---|---|
| Рендер дочерних компонентов | Полный | Заглушки |
| Скорость тестов | Ниже | Выше |
| Уровень изоляции | Низкий | Высокий |
| Подходит для | Интеграционных проверок | Модульных тестов |
| Устойчивость тестов | Ниже при рефакторинге | Выше |
Использование mount формирует тесты, ориентированные на
поведение связки компонентов. Проверяется не только логика самого
компонента, но и корректность его окружения. Такой подход оправдан при
тестировании:
shallowMount ориентирован на проверку внутренней
логики:
stubs и
mountОбе функции поддерживают явную подмену дочерних компонентов через
опцию global.stubs.
mount(Component, {
global: {
stubs: {
ChildComponent: true
}
}
})
В случае shallowMount это позволяет:
shallowMount(Component, {
global: {
stubs: {
ImportantChild: {
template: '<div>stub</div>'
}
}
}
})
Таким образом достигается гибкий баланс между изоляцией и необходимым уровнем детализации.
WrapperНезависимо от выбранной функции, результатом является
Wrapper, предоставляющий единый API:
find, findAll — поиск элементов;text, html — извлечение контента;props, emitted — анализ данных и
событий;setProps, setData — изменение
состояния.Разница заключается не в интерфейсе, а в том, какие элементы реально присутствуют в DOM.
При использовании mount дочерние компоненты могут
запускать асинхронные операции:
Это требует дополнительных механизмов синхронизации
(nextTick, flushPromises).
shallowMount минимизирует такие эффекты, так как логика
дочерних компонентов не выполняется.
Часто встречающиеся проблемы:
mount для тестирования простой
логики;Все эти ошибки увеличивают стоимость поддержки тестов и усложняют рефакторинг.
Выбор между mount и shallowMount — не
синтаксический, а архитектурный. Он отражает границы ответственности
теста и определяет, считается ли дочерний компонент частью тестируемой
системы или внешней зависимостью.
В корректно выстроенной системе тестирования:
shallowMount доминирует в модульных тестах;mount используется точечно, там где важна связка
компонентов;