В Vue Test Utils симулирование клика по элементам является одной из
базовых операций для проверки поведения компонентов. Метод
trigger('click') позволяет вызвать событие
click на выбранном DOM-элементе или обертке компонента,
имитируя взаимодействие пользователя.
trigger('click')Метод вызывается на объекте Wrapper или
DOMWrapper. Простейший пример:
import { mount } from '@vue/test-utils'
import ButtonComponent from '@/components/ButtonComponent.vue'
test('вызывает метод при клике', async () => {
const wrapper = mount(ButtonComponent)
await wrapper.find('button').trigger('click')
expect(wrapper.emitted()).toHaveProperty('click')
})
Ключевые моменты:
trigger возвращает промис, который необходимо ожидать
через await, чтобы гарантировать завершение всех реактивных
обновлений Vue.button,
div), так и на дочерних компонентах, если они используют
$emit.События могут включать параметры, имитирующие свойства
MouseEvent или другие пользовательские данные. Это делается
через объект с нужными полями:
await wrapper.find('button').trigger('click', {
button: 0, // левая кнопка мыши
ctrlKey: true, // имитация зажатой клавиши Ctrl
})
Обязательные поля не нужны, Vue Test Utils корректно создаёт объект события даже с пустыми параметрами, но для сложных сценариев имитация данных может быть критичной.
Если компонент содержит методы, привязанные к клику через директиву
@click:
<template>
<button @click="increment">Нажми</button>
</template>
<script>
export default {
data() {
return { count: 0 }
},
methods: {
increment() {
this.count++
}
}
}
</script>
Тестирование увеличения значения:
const wrapper = mount(Component)
const button = wrapper.find('button')
await button.trigger('click')
expect(wrapper.vm.count).toBe(1)
Важно: использование await гарантирует, что реактивное
обновление count произойдёт до проверки состояния.
Для проверки множественных взаимодействий достаточно вызывать
trigger несколько раз:
const wrapper = mount(Component)
const button = wrapper.find('button')
await button.trigger('click')
await button.trigger('click')
expect(wrapper.vm.count).toBe(2)
Vue Test Utils позволяет вызывать клики на компонентах, которые сами эмитируют события:
<ChildButton @click="$emit('child-click')" />
Тест:
const wrapper = mount(ParentComponent)
await wrapper.findComponent(ChildButton).trigger('click')
expect(wrapper.emitted('child-click')).toHaveLength(1)
Таким образом, trigger('click') универсален для проверки
взаимодействий как с нативными DOM-элементами, так и с компонентами.
Если обработчик клика включает асинхронные операции:
methods: {
async fetchData() {
this.loading = true
await api.getData()
this.loading = false
}
}
Необходимо ожидать завершения всех асинхронных действий перед проверкой состояния:
await wrapper.find('button').trigger('click')
await wrapper.vm.$nextTick() // ожидание обновления DOM
expect(wrapper.vm.loading).toBe(false)
Метод trigger может использоваться совместно с событиями
keydown, input, submit, что
позволяет тестировать цепочки взаимодействий, где клик инициирует
дальнейшие действия:
await wrapper.find('form').trigger('submit')
Иногда требуется удостовериться, что конкретный метод был вызван при клике. Для этого применяют шпионы:
const incrementSpy = vi.spyOn(wrapper.vm, 'increment')
await wrapper.find('button').trigger('click')
expect(incrementSpy).toHaveBeenCalled()
Подобный подход особенно полезен при сложной логике, когда изменение данных не единственный критерий корректного поведения.
await для trigger,
если проверяются реактивные данные.findComponent, чтобы симулировать пользовательский клик на
компоненте, а не на его DOM.trigger('click') в Vue Test Utils является основой для
эмуляции взаимодействия пользователя и позволяет уверенно тестировать
обработчики событий, изменение реактивного состояния и генерацию
кастомных событий.