You’re browsing the documentation for Vue Test Utils for Vue v2.x and earlier.
To read docs for Vue Test Utils for Vue 3, click here.
Тестирование нажатий клавиш, мыши и других событий DOM
Генерация событий
Wrapper предоставляет метод trigger. Его можно использовать для генерации событий DOM.
const wrapper = mount(MyButton)
wrapper.trigger('click')
Вы должны помнить, что метод find также возвращает Wrapper. Предполагается, что MyComponent содержит кнопку, а следующий код нажимает эту кнопку.
const wrapper = mount(MyComponent)
wrapper.find('button').trigger('click')
Опции
Метод trigger также может опционально принимать объект options. Свойства объекта options добавятся к Event.
Обратите внимание, что цель (target) не может добавлена в объект options.
const wrapper = mount(MyButton)
wrapper.trigger('click', { button: 0 })
Пример тестирования кнопки мыши
Тестируемый компонент
<template>
  <div>
    <button class="yes" @click="callYes">Yes</button>
    <button class="no" @click="callNo">No</button>
  </div>
</template>
<script>
  export default {
    name: 'YesNoComponent',
    props: {
      callMe: {
        type: Function
      }
    },
    methods: {
      callYes() {
        this.callMe('yes')
      },
      callNo() {
        this.callMe('no')
      }
    }
  }
</script>
Тест
import YesNoComponent from '@/components/YesNoComponent'
import { mount } from '@vue/test-utils'
import sinon from 'sinon'
describe('Click event', () => {
  it('Нажатие на кнопку yes вызывает наш метод с аргументом "yes"', () => {
    const spy = sinon.spy()
    const wrapper = mount(YesNoComponent, {
      propsData: {
        callMe: spy
      }
    })
    wrapper.find('button.yes').trigger('click')
    spy.should.have.been.calledWith('yes')
  })
})
Пример тестирования клавиши
Тестируемый компонент
Этот компонент позволяет увеличивать/уменьшать количество с помощью различных клавиш.
<template>
  <input type="text" @keydown.prevent="onKeydown" v-model="quantity" />
</template>
<script>
  const KEY_DOWN = 40
  const KEY_UP = 38
  const ESCAPE = 27
  export default {
    data() {
      return {
        quantity: 0
      }
    },
    methods: {
      increment() {
        this.quantity += 1
      },
      decrement() {
        this.quantity -= 1
      },
      clear() {
        this.quantity = 0
      },
      onKeydown(e) {
        if (e.keyCode === ESCAPE) {
          this.clear()
        }
        if (e.keyCode === KEY_DOWN) {
          this.decrement()
        }
        if (e.keyCode === KEY_UP) {
          this.increment()
        }
        if (e.key === 'a') {
          this.quantity = 13
        }
      }
    },
    watch: {
      quantity: function (newValue) {
        this.$emit('input', newValue)
      }
    }
  }
</script>
Тест
import QuantityComponent from '@/components/QuantityComponent'
import { mount } from '@vue/test-utils'
describe('Тестирование событий клавиш', () => {
  it('Quantity по умолчанию равно нулю', () => {
    const wrapper = mount(QuantityComponent)
    expect(wrapper.vm.quantity).toBe(0)
  })
  it('Клавиша вверх увеличивает quantity на 1', () => {
    const wrapper = mount(QuantityComponent)
    wrapper.trigger('keydown.up')
    expect(wrapper.vm.quantity).toBe(1)
  })
  it('Клавиша вниз уменьшает quantity на 1', () => {
    const wrapper = mount(QuantityComponent)
    wrapper.vm.quantity = 5
    wrapper.trigger('keydown.down')
    expect(wrapper.vm.quantity).toBe(4)
  })
  it('Escape устанавливает quantity равным 0', () => {
    const wrapper = mount(QuantityComponent)
    wrapper.vm.quantity = 5
    wrapper.trigger('keydown.esc')
    expect(wrapper.vm.quantity).toBe(0)
  })
  it('Магический символ "a" устанавливает quantity равным 13', () => {
    const wrapper = mount(QuantityComponent)
    wrapper.trigger('keydown', {
      key: 'a'
    })
    expect(wrapper.vm.quantity).toBe(13)
  })
})
Ограничения
Имя модификатора после точки keydown.up преобразуется в keyCode. Это поддерживается для следующих имён:
| key name | key code | 
|---|---|
| enter | 13 | 
| esc | 27 | 
| tab | 9 | 
| space | 32 | 
| delete | 46 | 
| backspace | 8 | 
| insert | 45 | 
| up | 38 | 
| down | 40 | 
| left | 37 | 
| right | 39 | 
| end | 35 | 
| home | 36 | 
| pageup | 33 | 
| pagedown | 34 | 
Важно
Vue Test Utils генерирует событие синхронно. Следовательно, Vue.nextTick не требуется.