shallowMount() — ключевой инструмент библиотеки Vue Test
Utils, предназначенный для поверхностного монтирования компонентов Vue.
В отличие от mount(), который полностью рендерит компонент
вместе с его дочерними компонентами, shallowMount()
заменяет все дочерние компоненты заглушками (stubs). Это позволяет
изолировать тестируемый компонент, упрощая тестирование его логики и
поведения без влияния вложенных компонентов.
shallowMount()Изоляция компонентов Все дочерние компоненты автоматически заменяются на заглушки, что позволяет сосредоточиться только на поведении текущего компонента.
Контроль props и слотов
shallowMount() позволяет передавать props и слоты точно так
же, как при обычном монтировании, обеспечивая полное управление входными
данными компонента.
Тестирование методов и реактивности Методы компонента, вычисляемые свойства (computed) и наблюдатели (watchers) остаются полностью функциональными. Любые изменения реактивных данных можно отслеживать и проверять.
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const wrapper = shallowMount(MyComponent, {
props: { title: 'Тестовый заголовок' },
slots: { default: '<p>Содержимое слота</p>' }
})
props — объект с пропсами, передаваемыми
компоненту.slots — объект со слотами, где ключи соответствуют
именам слотов, а значения — HTML-содержимое или компоненты.Ускорение тестов Поскольку дочерние компоненты не рендерятся полностью, тесты выполняются быстрее, особенно в крупных приложениях с множеством вложенных компонентов.
Упрощение тестовой среды Нет необходимости настраивать дочерние компоненты, что уменьшает количество внешних зависимостей и делает тесты более предсказуемыми.
Изоляция логики компонента Фокус на внутренней логике компонента, проверка методов, реактивных свойств и событий без влияния внешних компонентов.
По умолчанию shallowMount() создает автоматические
заглушки для всех дочерних компонентов. Возможна их явная настройка:
const wrapper = shallowMount(MyComponent, {
global: {
stubs: {
ChildComponent: true, // простая заглушка
AnotherComponent: { template: '<div>Заглушка</div>' } // кастомная заглушка
}
}
})
true — автоматическая заглушка с пустым шаблоном.template — позволяет задать кастомный HTML для
заглушки.$emit.Даже при использовании shallowMount() можно проверять,
что дочерний компонент был вызван с нужными props:
const wrapper = shallowMount(MyComponent)
expect(wrapper.findComponent({ name: 'ChildComponent' }).exists()).toBe(true)
expect(wrapper.findComponent({ name: 'ChildComponent' }).props('value')).toBe('тест')
Здесь findComponent позволяет находить замещенные
компоненты по имени или конструктору и проверять переданные им
данные.
Методы компонента остаются полностью доступными:
wrapper.vm.myMethod()
expect(wrapper.vm.someData).toBe('обновлено')
События также можно тестировать:
wrapper.find('button').trigger('click')
expect(wrapper.emitted('custom-event')).toBeTruthy()
shallowMount() не мешает работе событий, что позволяет
проверять корректность их генерации внутри тестируемого компонента.
Изменения в data и computed свойствах
компонента корректно отслеживаются:
wrapper.vm.counter++
await wrapper.vm.$nextTick()
expect(wrapper.find('span').text()).toBe('1')
Даже с поверхностным монтированием Vue обеспечивает реактивное
обновление DOM для текущего компонента, что делает
shallowMount() удобным для проверки динамического
поведения.
Если компонент использует Vuex, Vue Router или другие плагины, их
можно подключать через опцию global:
import { createStore } from 'vuex'
const store = createStore({ state: { count: 0 } })
const wrapper = shallowMount(MyComponent, {
global: { plugins: [store] }
})
shallowMount() корректно работает с такими плагинами, не
рендеря полностью дочерние компоненты.
shallowMount()mount() для отдельных случаев.shallowMount() обеспечивает мощный инструмент для
модульного тестирования компонентов Vue, позволяя изолировать логику,
ускорять тесты и сосредотачиваться на поведении конкретного компонента
без лишнего шума от дочерних компонентов.