Vue Test Utils (VTU) является официальной библиотекой для тестирования компонентов Vue.js. Она предназначена для изолированного и интеграционного тестирования компонентов и взаимодействия между ними. В экосистеме JavaScript тестирования VTU занимает промежуточное место между низкоуровневыми инструментами (например, Jest, Mocha) и высокоуровневыми тестами пользовательского интерфейса (например, Cypress, Playwright).
Изоляция компонентов VTU предоставляет возможность тестировать компоненты отдельно от всего приложения, включая их внутренние методы, вычисляемые свойства и реактивное состояние. Это позволяет проверять логику компонента без влияния глобального состояния приложения.
Взаимодействие с DOM VTU создает виртуальный DOM с помощью Vue, обеспечивая возможность манипулировать элементами и отслеживать изменения. Это делает тесты реалистичными, но при этом быстрыми, так как отсутствует необходимость запускать полноценный браузер.
Эмуляция событий и пользовательских действий Библиотека поддерживает три вида взаимодействий: имитацию кликов, ввод текста и изменение состояний компонентов. Эти действия запускают реактивные механизмы Vue, позволяя проверить правильность реакций компонента на пользовательские действия.
mount и shallowMount
mount создает полный экземпляр компонента с его
дочерними компонентами. Используется для интеграционных тестов, когда
важна работа всей иерархии.shallowMount создает экземпляр компонента без
рендеринга дочерних компонентов, заменяя их заглушками. Применяется для
модульного тестирования, чтобы изолировать проверяемый компонент.Пример:
import { mount, shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const wrapperFull = mount(MyComponent)
const wrapperShallow = shallowMount(MyComponent)
find и findAll Позволяют
находить элементы внутри компонента по CSS-селекторам, атрибутам или
компонентам.
find возвращает первый найденный элемент.findAll возвращает массив всех соответствующих
элементов.const button = wrapper.find('button')
const inputs = wrapper.findAll('input')
setData, setProps,
setValue Методы для изменения состояния компонента
и проверки реактивности:
setData({ key: value }) — обновляет реактивные данные
компонента.setProps({ prop: value }) — изменяет свойства
компонента.setValue(value) — изменяет значение формы (input,
textarea) и триггерит соответствующие события.VTU позволяет проверять работу методов жизненного цикла Vue:
mounted, created, updated. С
помощью моков и spy-функций можно отслеживать вызовы внутренних методов
и реакцию на изменение состояния.
const spy = jest.spyOn(MyComponent.methods, 'increment')
wrapper.find('button').trigger('click')
expect(spy).toHaveBeenCalled()
Асинхронные обновления DOM Vue обновляет DOM
асинхронно. VTU предоставляет функцию nextTick для ожидания
завершения реактивных изменений, что позволяет корректно проверять
результаты после обновления состояния.
await wrapper.setData({ count: 1 })
await wrapper.vm.$nextTick()
expect(wrapper.text()).toContain('1')
VTU позволяет эмулировать события DOM и настраивать их параметры.
trigger(event, options) — вызывает событие на
элементе.emitted() — проверяет, какие события компонент
сгенерировал и с какими параметрами.wrapper.find('button').trigger('click')
expect(wrapper.emitted('submit')).toBeTruthy()
expect(wrapper.emitted('submit')[0]).toEqual([{ name: 'test' }])
VTU не является фреймворком для выполнения тестов, поэтому обычно используется вместе с Jest или Mocha. Это позволяет комбинировать функционал VTU (рендеринг и взаимодействие с компонентами) с мощными инструментами для ассертирования и мокирования.
Пример теста с Jest:
test('проверка клика по кнопке', async () => {
const wrapper = mount(MyComponent)
await wrapper.find('button').trigger('click')
expect(wrapper.text()).toContain('Clicked')
})
VTU позволяет покрывать тестами критические части приложения на Vue без необходимости запускать полноценный браузер или использовать сложные end-to-end решения, что делает тестирование быстрым, предсказуемым и масштабируемым.