Это руководство было написано для Vue.js 2 и Vue Test Utils v1.
Версия для Vue.js 3 здесь.
# Два способа отрисовки
vue-test-utils
позволяет отрисовывать компонент двумя способами – mount
и shallowMount
. В любом из этих случаев, метод вернёт так называемый wrapper
, который содержит объект с Vue компонентом и некоторыми полезными методами для тестирования.
Давайте разберёмся на двух простых компонентах:
const Child = Vue.component("Child", {
name: "Child",
template: "<div>Дочерний компонент</div>"
})
const Parent = Vue.component("Parent", {
name: "Parent",
template: "<div><child/></div>"
})
Начнём с отрисовки Child
, а затем вызовем метод html
, который предоставляет vue-test-utils
для тестирования разметки.
const shallowWrapper = shallowMount(Child)
const mountWrapper = mount(Child)
console.log(shallowWrapper.html())
console.log(mountWrapper.html())
Оба mountWrapper.html()
и shallowWrapper.html()
дают одинаковый результат:
<div>Дочерний компонент</div>
Разницы нет. Но что насчёт Parent
?
const shallowWrapper = shallowMount(Parent)
const mountWrapper = mount(Parent)
console.log(shallowWrapper.html())
console.log(mountWrapper.html())
mountWrapper.html()
теперь выводит:
<div><div>Дочерний компонент</div></div>
Полностью повторяется разметка Parent
и Child
. Однако shallowWrapper.html()
выводит следующее:
<div><vuecomponent-stub></vuecomponent-stub></div>
То место, где должен быть <Child />
теперь занимает <vuecomponent-stub />
. shallowMount
отрисовывает обычный html, но заменяет Vue-компоненты на заглушки.
Под заглушкой (stub) понимают поддельный объект, который помещается вместо настоящего.
Это может быть полезно. Представьте, вы хотите протестировать компонент App.vue
, который выглядит так:
<template>
<div>
<h1>Моё Vue-приложение</h1>
<fetch-data />
</div>
</template>
И мы хотим протестировать, что <h1>Моё Vue-приложение</h1>
выводится правильно. У нас также есть компонент <fetch-data/>
, который делает запросы к стороннему API в своём mounted
хуке.
Если мы используем mount
, то <fetch-data/>
сделает запрос к API, хотя мы хотим всего лишь проверить отрисовку текста. Это сделает наши тесты медленными и ненадёжными. Поэтому мы применяем заглушки для сторонних зависимостей. Используя shallowMount
, компонент <fetch-data/>
заменится на <vuecomponent-stub />
и запроса к API не произойдёт.
Как правило, вы должны использовать mount
, поскольку это будет отражать поведение компонента в реальной среде. Тем не менее, если у вас возникли проблемы с выполнением множественных запросов API или с предоставлением необходимых зависимостей для рендеринга вашего компонента – вы можете использовать shallowMount
.