@testing-library/vue: монтирование компонентов
Монтируйте компоненты Vue с помощью @testing-library/vue, передавайте props и глобальные плагины, имитируйте действия пользователя и проверяйте отрисованный шаблон.
«@testing-library/vue: монтирование компонентов» — бесплатный урок Frontend Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Frontend Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Frontend Academy содержит 4 уроков всего.
Testing Library для Vue
@testing-library/vue предоставляет такой же ориентированный на пользователя подход к тестированию компонентов Vue 3. API аналогичен версии для React: render(), запросы screen, userEvent и сопоставители jest-dom.
Установка
Установите пакеты Testing Library для Vue.
npm install -D @testing-library/vue @testing-library/user-event @testing-library/jest-dom
# Also install vitest for a Vite project:
npm install -D vitest jsdomМонтирование во Vue
render(Component, options) монтирует компонент Vue. Используйте объект параметров для передачи свойств, глобальных плагинов и параметров настройки.
import { render, screen } from '@testing-library/vue';
import Button from './Button.vue';
test('renders button label', () => {
render(Button, { props: { label: 'Submit' } });
expect(screen.getByRole('button', { name: 'Submit' })).toBeInTheDocument();
});Передача свойств
Передавайте свойства в объекте параметров. TypeScript проверит типы свойств, если вы используете defineProps<T>().
render(UserCard, {
props: {
user: { id: 1, name: 'Alice', email: 'alice@example.com' }
}
});Предоставление глобальных плагинов
Передавайте глобальную конфигурацию (плагины, компоненты и предоставляемые значения) в глобальном параметре.
import { createPinia } from 'pinia';
import router from './router';
render(App, {
global: {
plugins: [createPinia(), router],
provide: { theme: 'dark' }
}
});Вспомогательная функция renderWithPlugins для повторного использования
Создайте собственную оболочку для монтирования, включающую все плагины, необходимые для тестирования, чтобы не повторять настройку в каждом тесте.
// test-utils.ts
import { render } from '@testing-library/vue';
import { createPinia } from 'pinia';
export function renderWithSetup(component: any, options = {}) {
return render(component, {
global: { plugins: [createPinia()] },
...options
});
}Тестирование событий
Используйте userEvent для взаимодействия с компонентом, затем проверьте то, что видит пользователь, или убедитесь, что события были отправлены.
import userEvent from '@testing-library/user-event';
test('emits submit on form submit', async () => {
const user = userEvent.setup();
const { emitted } = render(LoginForm);
await user.type(screen.getByLabelText('Email'), 'alice@example.com');
await user.click(screen.getByRole('button', { name: /login/i }));
expect(emitted().submit[0]).toEqual([{ email: 'alice@example.com' }]);
});Тестирование слотов
Передавайте содержимое слота в виде строки или компонента в параметрах монтирования.
render(Card, {
slots: {
default: '<p>Card body content</p>',
header: '<h2>My Card Title</h2>'
}
});
expect(screen.getByText('Card body content')).toBeInTheDocument();Тестирование поведения v-model
Заполняйте поля ввода с помощью userEvent и проверяйте отправленные события или соответствие отображаемого результата ожидаемому обновлённому состоянию.
Тестирование хранилищ Pinia
Создавайте новый экземпляр Pinia для каждого теста. Для настройки изменяйте состояние хранилища напрямую, затем проверяйте отображаемый результат.
const pinia = createPinia();
render(Counter, { global: { plugins: [pinia] } });
const store = useCounterStore();
store.count = 5; // set initial state
await nextTick();
expect(screen.getByText('5')).toBeInTheDocument();Поиск элементов после асинхронных обновлений
Vue обновляет DOM асинхронно. Используйте await nextTick() или запросы findBy* после вызова события, которое приводит к асинхронным изменениям состояния.
import { nextTick } from 'vue';
await user.click(button);
await nextTick();
expect(screen.getByText('Updated!')).toBeInTheDocument();Быстрая проверка
Как передать Pinia или Vue Router компоненту, тестируемому с помощью @testing-library/vue?
Итоги: @testing-library/vue
render(Component, options) монтирует компоненты Vue. Передавайте свойства в options.props. Предоставляйте плагины в global.plugins. Используйте emitted() для проверки пользовательских событий. Передавайте слоты в options.slots. Используйте await nextTick() для асинхронных обновлений Vue. Создайте собственную оболочку renderWithSetup() для общей настройки плагинов.
Изучай HTML с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 41
- Уроки
- 163
Часто задаваемые вопросы
Урок «@testing-library/vue: монтирование компонентов» бесплатный?
Да — полный текст урока «@testing-library/vue: монтирование компонентов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Frontend Academy, подпишись на CoddyKit PRO. Курс Frontend Academy содержит 4 уроков всего.
Чему я научусь в уроке «@testing-library/vue: монтирование компонентов»?
Монтируйте компоненты Vue с помощью @testing-library/vue, передавайте props и глобальные плагины, имитируйте действия пользователя и проверяйте отрисованный шаблон. Ты практикуешь Frontend Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Frontend Academy?
Предыдущий опыт не требуется. Frontend Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «@testing-library/vue: монтирование компонентов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Frontend Academy?
Да. Каждый урок Frontend Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Настройка Jest и базовые тесты
- @testing-library/react: render и userEvent
- @testing-library/vue: монтирование компонентов
- Имитация модулей и API-вызовов