Для работы с формами и вводом текста в Vue компонентах используется
метод mount из библиотеки Vue Test Utils. Этот метод
создаёт изолированный экземпляр компонента, позволяя взаимодействовать с
его DOM и внутренним состоянием.
import { mount } from '@vue/test-utils'
import MyForm from '@/components/MyForm.vue'
const wrapper = mount(MyForm)
После монтирования компонента можно получить доступ к элементам формы
через методы find и findAll, используя
селекторы CSS или data-testid атрибуты, что повышает
устойчивость тестов к изменениям верстки.
const input = wrapper.find('input[name="username"]')
const submitButton = wrapper.find('button[type="submit"]')
Для имитации ввода текста в поля формы используется метод
setValue, который обновляет значение элемента и
автоматически триггерит событие input. Это позволяет
проверить реакцию компонента на изменение данных.
await input.setValue('testuser')
expect(input.element.value).toBe('testuser')
setValue объединяет несколько действий: изменение
value и вызов событий input и
change, что делает его предпочтительным для большинства
случаев тестирования ввода.
После изменения значения формы часто требуется проверить обновление
реактивных данных компонента. Vue Test Utils позволяет напрямую
обращаться к vm (экземпляру Vue) или использовать
вычисляемые свойства и методы.
expect(wrapper.vm.username).toBe('testuser')
Если компонент использует двухстороннюю привязку через
v-model, изменения в поле автоматически синхронизируются с
реактивным состоянием, что упрощает тесты.
Для тестирования поведения при отправке формы используется метод
trigger, который позволяет инициировать события DOM, такие
как submit, click или кастомные события.
await submitButton.trigger('click')
// или
await wrapper.find('form').trigger('submit.prevent')
Метод trigger принимает название события и объект с
дополнительными параметрами, например координатами мыши или
клавишами.
await input.trigger('keydown.enter')
Компоненты с формами часто включают валидацию. Vue Test Utils позволяет проверить отображение сообщений об ошибках и состояние элементов формы.
await input.setValue('')
await submitButton.trigger('click')
expect(wrapper.text()).toContain('Поле обязательно для заполнения')
Важно учитывать, что асинхронные валидации требуют использования
await для ожидания завершения всех реактивных обновлений,
чтобы DOM отобразил новые состояния.
Для форм с несколькими полями удобно использовать методы
findAll и итерацию по элементам:
const inputs = wrapper.findAll('input')
const values = ['user1', 'user2', 'user3']
for (let i = 0; i < inputs.length; i++) {
await inputs[i].setValue(values[i])
}
Такой подход позволяет систематически тестировать формы без дублирования кода.
Для тестирования отправки данных формы часто используют моки функций или сервисов, которые обрабатывают запросы.
const mockSubmit = jest.fn()
const wrapper = mount(MyForm, {
props: { onSubmit: mockSubmit }
})
await wrapper.find('form').trigger('submit.prevent')
expect(mockSubmit).toHaveBeenCalled()
Это обеспечивает независимость тестов от реального API и позволяет проверять корректность передачи данных.
nextTickМногие операции с формами могут быть асинхронными, особенно при
использовании вычисляемых свойств или внешних библиотек валидации. Для
точной проверки состояния DOM после изменений необходимо использовать
await nextTick() из Vue.
import { nextTick } from 'vue'
await input.setValue('newvalue')
await nextTick()
expect(wrapper.text()).toContain('newvalue')
Это гарантирует, что все реактивные обновления завершены перед проверкой результата.
data-testid для полей ввода и
кнопок, чтобы тесты были устойчивы к изменениям классов и разметки.describe для каждого шага, поддерживая читаемость
тестов.Vue Test Utils предоставляет полный набор инструментов для имитации
ввода, проверки реактивного состояния и отправки форм. Использование
setValue, trigger и проверки vm
позволяет создавать детальные и надёжные тесты компонентов с минимальным
кодом, обеспечивая уверенность в корректности работы форм и
валидации.