В Vue-компонентах props представляют собой основной
механизм передачи данных от родителя к дочернему компоненту. При
тестировании важно уметь имитировать изменение этих данных, чтобы
проверить реакцию компонента на новые значения. Для этого в Vue
Test Utils используется метод
setProps.
Метод setProps вызывается на объекте
wrapper, который представляет смонтированный компонент. Он
принимает объект с ключами, соответствующими именам props, и значениями,
которые нужно установить.
import { mount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const wrapper = mount(MyComponent, {
props: {
title: 'Начальное значение'
}
})
// Изменение значения prop
await wrapper.setProps({ title: 'Новое значение' })
expect(wrapper.text()).toContain('Новое значение')
Особенности:
setProps возвращает Promise, поэтому
необходимо использовать await или then для
ожидания завершения асинхронного обновления.Метод поддерживает передачу нескольких свойств одновременно:
await wrapper.setProps({ title: 'Заголовок', count: 5 })
expect(wrapper.text()).toContain('Заголовок')
expect(wrapper.find('.count').text()).toBe('5')
Это особенно полезно при тестировании компонентов с зависимостями между props.
При наличии вложенных компонентов setProps обновляет
данные только у тестируемого компонента. Для проверки
передачи изменённых props во вложенные компоненты необходимо
использовать shallowMount или проверять props дочернего
компонента через wrapper.findComponent.
const parentWrapper = mount(ParentComponent, {
props: { userName: 'Alice' }
})
await parentWrapper.setProps({ userName: 'Bob' })
const childWrapper = parentWrapper.findComponent(ChildComponent)
expect(childWrapper.props('userName')).toBe('Bob')
Изменение props через setProps автоматически триггерит
перерасчёт computed properties и
watchers. Если компонент использует слоты с реактивными
данными, изменения также отразятся на их содержимом.
const wrapper = mount(MyComponent, {
props: { active: false }
})
await wrapper.setProps({ active: true })
expect(wrapper.vm.isActive).toBe(true) // computed property
Метод setProps работает асинхронно, потому что Vue
обновляет DOM в следующем тикe. Прямое обращение к DOM сразу после
вызова setProps может вернуть старое состояние:
await wrapper.setProps({ title: 'Новое' })
console.log(wrapper.text()) // корректное значение после await
Если await опустить, проверка текста может вернуть
старое значение.
setProps не изменяет props родителя, а только у
смонтированного экземпляра.setData.props компонента, setProps не будет работать и
выдаст предупреждение.await для ожидания полного
обновления.setProps с setData для
имитации комплексных сценариев взаимодействия props и локального
состояния.const wrapper = mount(MyComponent, {
props: { visible: false, items: [] }
})
// Проверка скрытого состояния
expect(wrapper.classes()).not.toContain('visible')
// Изменение props
await wrapper.setProps({ visible: true, items: ['a', 'b', 'c'] })
// Проверка обновлённого состояния и DOM
expect(wrapper.classes()).toContain('visible')
expect(wrapper.findAll('li').length).toBe(3)
Этот пример демонстрирует, как с помощью setProps
тестировать динамические изменения состояния компонента, зависящие от
нескольких props.
Метод setProps является фундаментальным инструментом для
тестирования реактивного поведения Vue-компонентов и позволяет точно
моделировать сценарии изменения входных данных, обеспечивая надежность и
предсказуемость тестов.