Тестирование компонентов Vue часто начинается с проверки того, что элементы корректно отображаются в DOM. Vue Test Utils (VTU) предоставляет набор методов для рендеринга компонентов и взаимодействия с ними, а также для проверки структуры DOM.
Основной способ работы с компонентом — это его монтирование с помощью
функции mount или shallowMount.
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const wrapper = mount(MyComponent)
mount создаёт полноценный компонент с дочерними
компонентами.shallowMount рендерит компонент, но заменяет все
дочерние компоненты на заглушки, что ускоряет тесты и изолирует
проверку.После монтирования wrapper предоставляет доступ к DOM
через методы find, findAll, text,
html и другие.
1. find и findAll
find(selector) — возвращает первый элемент,
соответствующий селектору.findAll(selector) — возвращает массив (WrapperArray)
всех элементов, соответствующих селектору.const button = wrapper.find('button')
expect(button.exists()).toBe(true)
const items = wrapper.findAll('.list-item')
expect(items.length).toBe(3)
Ключевой метод для проверки наличия элемента — это
exists(). Он возвращает true, если элемент
найден, и false, если нет.
2. Поиск по компонентам
Помимо CSS-селекторов, поиск возможен по компонентам:
import ChildComponent from '@/components/ChildComponent.vue'
const child = wrapper.findComponent(ChildComponent)
expect(child.exists()).toBe(true)
Можно также использовать объекты с опцией name или
ref:
const refElement = wrapper.find({ ref: 'submitButton' })
expect(refElement.exists()).toBe(true)
После нахождения элемента часто проверяется его текстовое содержимое. Для этого используются методы:
text() — возвращает текст внутри элемента.html() — возвращает HTML-код элемента.const header = wrapper.find('h1')
expect(header.text()).toBe('Заголовок страницы')
Это полезно для проверки, что элементы не только присутствуют в DOM, но и содержат корректное содержимое.
Многие компоненты Vue используют асинхронные обновления через
nextTick или API-запросы. Для корректной проверки наличия
элементов необходимо дождаться обновления DOM:
import { nextTick } from 'vue'
wrapper.vm.showDetails = true
await nextTick()
const details = wrapper.find('.details')
expect(details.exists()).toBe(true)
Без await nextTick() проверка может выполняться до того,
как DOM успеет обновиться, и тест будет ложным.
Vue позволяет рендерить элементы условно через v-if или
v-show. Для проверки таких элементов используют
exists() или isVisible():
const modal = wrapper.find('.modal')
expect(modal.exists()).toBe(false)
wrapper.setData({ showModal: true })
await nextTick()
expect(modal.exists()).toBe(true)
expect(modal.isVisible()).toBe(true)
exists() проверяет наличие элемента в DOM.isVisible() проверяет, видим ли элемент пользователю
(учитывает display: none и другие CSS-свойства).Наличие элементов часто сопровождается проверкой классов или атрибутов:
const button = wrapper.find('button')
expect(button.classes()).toContain('primary')
expect(button.attributes('disabled')).toBe('disabled')
classes() возвращает массив классов элемента.attributes(name) возвращает значение атрибута.Это позволяет убедиться, что элемент не только существует, но и имеет правильное состояние.
exists().findAll и
проверку длины массива.nextTick() или
await wrapper.vm.$nextTick().isVisible(), а для
проверки состояния — classes() и
attributes().findComponent, а для элементов с ref — объект
с { ref: 'имя' }.Эти методы создают основу для надёжного тестирования Vue-компонентов, позволяя убедиться, что DOM отражает ожидаемое состояние приложения.