Component Testing Library (CTL) предназначена для тестирования отдельных компонентов в SvelteKit, обеспечивая удобный и высокоуровневый API для взаимодействия с DOM и проверки поведения компонентов. В отличие от традиционного unit-тестирования, CTL фокусируется на пользовательском опыте и взаимодействиях, а не на внутренней реализации компонентов.
Для интеграции CTL в проект SvelteKit используется следующая команда:
npm install --save-dev @testing-library/svelte @testing-library/jest-dom jest
После установки необходимо настроить окружение для Jest или Vitest, подключив соответствующие адаптеры и расширения для DOM-assertions:
import '@testing-library/jest-dom';
Основной функцией является render(). Она позволяет
создать виртуальный экземпляр компонента и работать с ним в тестах:
import { render } from '@testing-library/svelte';
import Button from '../src/components/Button.svelte';
test('рендерит кнопку с текстом', () => {
const { getByText } = render(Button, { props: { label: 'Отправить' } });
expect(getByText('Отправить')).toBeInTheDocument();
});
Ключевые моменты:
render(Component, { props }) — создаёт экземпляр
компонента с заданными свойствами.getByText, getByRole,
queryByTestId, findByText.jest-dom позволяет делать
наглядные утверждения о состоянии элементов:
toBeVisible(), toHaveClass(),
toHaveAttribute().Для имитации действий пользователя используется объект
fireEvent или userEvent:
import { fireEvent } from '@testing-library/svelte';
test('обрабатывает клик по кнопке', async () => {
const { getByText } = render(Button, { props: { label: 'Кликни меня' } });
const button = getByText('Кликни меня');
await fireEvent.click(button);
expect(button).toHaveClass('active');
});
Особенности:
fireEvent имитирует события DOM (click,
input, change).await для
корректного применения изменений.userEvent предоставляет более реалистичные симуляции
пользовательских действий (например, ввод текста через клавиатуру).CTL позволяет тестировать реактивные свойства и состояние компонента без прямого доступа к внутренним переменным:
import Counter from '../src/components/Counter.svelte';
test('увеличивает значение счетчика', async () => {
const { getByText } = render(Counter);
const incrementButton = getByText('Увеличить');
const countDisplay = getByText('0');
await fireEvent.click(incrementButton);
expect(countDisplay).toHaveTextContent('1');
});
Важные моменты:
toHaveTextContent,
toHaveAttribute.await tick() или асинхронными
методами внутри Svelte.SvelteKit активно использует слоты, и Component Testing Library предоставляет удобные способы тестирования вложенного контента:
import Card from '../src/components/Card.svelte';
import { render } from '@testing-library/svelte';
test('рендерит слоты', () => {
const { getByText } = render(Card, {
slots: { default: '<p>Контент слота</p>' }
});
expect(getByText('Контент слота')).toBeInTheDocument();
});
Особенности:
slots.{ header: '<h1>Заголовок</h1>', footer: '<p>Футер</p>' }.Компоненты, которые используют onMount или асинхронные
данные, требуют особого подхода:
import UserCard from '../src/components/UserCard.svelte';
import { render, waitFor } from '@testing-library/svelte';
test('загружает данные пользователя', async () => {
const { getByText } = render(UserCard, { props: { userId: 1 } });
await waitFor(() => getByText('Имя пользователя'));
expect(getByText('Имя пользователя')).toBeInTheDocument();
});
waitFor ожидает изменения DOM до выполнения
проверки.getByRole, getByLabelText) вместо
querySelector для улучшенной читаемости тестов.waitFor или findBy* методы.jest-dom,
а не напрямую через element.className.Тесты на Component Testing Library легко интегрируются с Jest или Vitest, что позволяет запускать их автоматически при сборке проекта:
"scripts": {
"test": "vitest run"
}
Component Testing Library в SvelteKit обеспечивает удобную и гибкую платформу для проверки компонентов в условиях, максимально приближённых к реальному взаимодействию пользователя с интерфейсом. Она интегрируется с реактивной системой Svelte, поддерживает асинхронные действия и слоты, что делает её идеальной для комплексного тестирования UI.