Props передають при монтуванні й змінюють пізніше через setProps:
const wrapper = mount(PriceTag, {
props: { amount: 1250, currency: 'UAH' },
})
expect(wrapper.text()).toContain('1 250')
await wrapper.setProps({ amount: 99 })
expect(wrapper.text()).toContain('99')
setProps повертає Promise - після await DOM уже оновлений. Так перевіряють, що компонент правильно реагує на зміну props, а не лише на початкові значення.
Слоти - рядками з розміткою, компонентами чи функціями рендеру:
const wrapper = mount(Card, {
slots: {
default: '<p>Основний вміст</p>',
header: '<h2>Заголовок</h2>',
footer: FooterActions,
},
})
expect(wrapper.get('header').text()).toBe('Заголовок')
expect(wrapper.html()).toContain('Основний вміст')
Scoped slots - шаблон отримує параметри слоту через params:
const wrapper = mount(DataList, {
props: { items: [{ id: 1, name: 'Оля' }] },
slots: {
item: '<span class="name">{{ params.item.name }}</span>',
},
})
expect(wrapper.get('.name').text()).toBe('Оля')
Так перевіряється контракт слоту: які дані компонент передає назовні.
Атрибути, що не є props (class, id, data-*), перевіряються на корені:
const wrapper = mount(BaseButton, { attrs: { class: 'w-full', 'data-test': 'submit' } })
expect(wrapper.classes()).toContain('w-full')
Що варто перевіряти:
- граничні значення props: порожній масив,
null, дуже довгий текст, нуль - саме там живуть баги; - відсутній слот: компонент має коректно рендеритися, якщо необов'язковий слот не передали (і, наприклад, не показувати порожню обгортку);
- заглушка за замовчуванням у слоті показується, коли вміст не передано.
Чого не варто: перевіряти, що prop «дійшов» у внутрішню змінну через wrapper.vm - це деталь реалізації. Перевіряйте вивід.