Именованные слоты в Vue позволяют компонентам быть более гибкими, предоставляя возможность вставлять содержимое в определённые части компонента. Для комплексного тестирования таких компонентов важно понимать, как Vue Test Utils взаимодействует со слотами и как проверять их поведение.
В Vue компонент может определять несколько слотов с разными именами:
<template>
<div class="card">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
В этом примере:
header и footer — именованные слоты.При тестировании важно передавать именно те слоты, которые используются в компоненте, иначе они останутся пустыми.
Vue Test Utils предоставляет возможность передавать слоты через опцию
slots при монтировании компонента:
import { mount } from '@vue/test-utils'
import Card from '@/components/Card.vue'
const wrapper = mount(Card, {
slots: {
header: '<h1>Заголовок</h1>',
default: '<p>Основной контент</p>',
footer: '<small>Подвал</small>'
}
})
Ключевые моменты:
slots должно точно соответствовать
имени слота в компоненте.После монтирования компонента можно проверять, что контент слотов отображается корректно:
expect(wrapper.find('header h1').text()).toBe('Заголовок')
expect(wrapper.find('main p').text()).toBe('Основной контент')
expect(wrapper.find('footer small').text()).toBe('Подвал')
При этом find ищет элементы в DOM компонента, что
позволяет убедиться, что переданный слот корректно встроился.
Слоты могут содержать не только строковый HTML, но и другие компоненты:
import CustomHeader from '@/components/CustomHeader.vue'
const wrapper = mount(Card, {
slots: {
header: CustomHeader
}
})
Vue Test Utils автоматически рендерит переданный компонент в слот.
Проверка его наличия осуществляется через методы
findComponent или exists:
expect(wrapper.findComponent(CustomHeader).exists()).toBe(true)
Некоторые компоненты передают данные в слот через
v-slot. Для тестирования таких сценариев важно передавать
функцию:
<slot name="item" :text="itemText"></slot>
В тесте это можно эмулировать так:
const wrapper = mount(ListComponent, {
slots: {
item: '<template #item="{ text }"><li>{{ text }}</li></template>'
}
})
Проверка рендеринга может включать поиск всех элементов
li и проверку их текста:
const items = wrapper.findAll('li')
expect(items[0].text()).toBe('Первый элемент')
Если слот отображается только при определённых условиях, важно учитывать реактивность:
<slot v-if="showFooter" name="footer"></slot>
Тест должен корректно изменять состояние компонента и проверять присутствие слота:
await wrapper.setData({ showFooter: true })
expect(wrapper.find('footer').exists()).toBe(true)
await wrapper.setData({ showFooter: false })
expect(wrapper.find('footer').exists()).toBe(false)
slots.findComponent для
проверки их рендеринга.Именованные слоты увеличивают гибкость компонентов, а Vue Test Utils предоставляет полный инструментарий для их тестирования: передача контента, проверка рендеринга, использование компонентов и слотов с пропсами, а также проверка динамических условий. Правильная структура тестов позволяет обеспечить стабильность компонентов даже при сложных комбинациях слотов.