Unit-тестирование в контексте компонентов Chakra UI строится на проверке их поведения и визуальной структуры изолированно от остального приложения. Основная цель — убедиться, что компоненты рендерятся корректно, корректно обрабатывают пропсы и взаимодействуют с пользовательскими событиями.
Для тестирования чаще всего используется связка Jest + React Testing Library. React Testing Library обеспечивает удобные утилиты для рендеринга компонентов и проверки их состояния, а Chakra UI предоставляет возможность интеграции через ChakraProvider, чтобы тестовый рендеринг корректно применял темы и контекст.
import { render, screen } from '@testing-library/react';
import { ChakraProvider, Button } from '@chakra-ui/react';
test('рендер кнопки с правильным текстом', () => {
render(
<ChakraProvider>
<Button>Нажми меня</Button>
</ChakraProvider>
);
expect(screen.getByText('Нажми меня')).toBeInTheDocument();
});
Ключевой момент: без обёртки ChakraProvider компоненты, использующие темы, цвета или системные стили, могут некорректно рендериться. Любые тесты должны учитывать контекст Chakra.
Chakra UI предоставляет множество пропсов для настройки компонентов. Unit-тесты должны проверять их влияние на рендер и поведение:
import { render } from '@testing-library/react';
import { Button, ChakraProvider } from '@chakra-ui/react';
test('кнопка с цветовой схемой teal имеет соответствующий класс', () => {
const { container } = render(
<ChakraProvider>
<Button colorScheme="teal">Тест</Button>
</ChakraProvider>
);
expect(container.querySelector('button')).toHaveClass('chakra-button--teal');
});
Тестирование пропсов включает проверку того, как компонент реагирует на различные значения: активное состояние, disabled, loading и другие стандартные варианты Chakra UI.
Unit-тесты проверяют реакцию компонентов на события, такие как клики, фокус и изменение значения:
import { render, fireEvent, screen } from '@testing-library/react';
import { Button, ChakraProvider } from '@chakra-ui/react';
test('клик по кнопке вызывает переданную функцию', () => {
const handleClick = jest.fn();
render(
<ChakraProvider>
<Button onCl ick={handleClick}>Кликни</Button>
</ChakraProvider>
);
fireEvent.click(screen.getByText('Кликни'));
expect(handleClick).toHaveBeenCalledTimes(1);
});
Важно использовать утилиты fireEvent или userEvent, чтобы моделировать реальные действия пользователя и проверять, что компонент корректно их обрабатывает.
Компоненты Chakra UI часто имеют внутреннее состояние, например, Accordion, Tabs, Modal. Unit-тестирование проверяет открытие/закрытие элементов, переключение вкладок и изменения видимости:
import { render, screen, fireEvent } from '@testing-library/react';
import { ChakraProvider, Accordion, AccordionItem, AccordionButton, AccordionPanel } from '@chakra-ui/react';
test('раскрытие панели аккордеона', () => {
render(
<ChakraProvider>
<Accordion>
<AccordionItem>
<AccordionButton>Заголовок</AccordionButton>
<AccordionPanel>Контент</AccordionPanel>
</AccordionItem>
</Accordion>
</ChakraProvider>
);
expect(screen.queryByText('Контент')).not.toBeVisible();
fireEvent.click(screen.getByText('Заголовок'));
expect(screen.getByText('Контент')).toBeVisible();
});
Тестирование состояния позволяет выявить ошибки взаимодействия
компонентов с контекстом Chakra, например некорректное использование
useDisclosure или useTabs.
Chakra UI компоненты поддерживают snapshоt-тестирование, позволяя фиксировать рендер и отслеживать изменения в DOM:
import { render } from '@testing-library/react';
import { ChakraProvider, Button } from '@chakra-ui/react';
test('снапшот кнопки', () => {
const { asFragment } = render(
<ChakraProvider>
<Button colorScheme="blue">Снапшот</Button>
</ChakraProvider>
);
expect(asFragment()).toMatchSnapshot();
});
Snapshоt полезен для проверки визуальных изменений после обновления Chakra UI или изменения темы. Однако не следует полагаться только на него — лучше сочетать с проверкой конкретного поведения и пропсов.
Иногда нужно тестировать компоненты вне глобальной темы или с кастомной конфигурацией. Chakra UI позволяет создавать собственные темы и контекст:
import { extendTheme, ChakraProvider, Button } from '@chakra-ui/react';
import { render, screen } from '@testing-library/react';
const customTheme = extendTheme({
colors: {
brand: {
500: '#1a202c',
},
},
});
test('кнопка с кастомной цветовой схемой', () => {
render(
<ChakraProvider theme={customTheme}>
<Button colorScheme="brand">Кастом</Button>
</ChakraProvider>
);
expect(screen.getByText('Кастом')).toBeInTheDocument();
});
Мокирование темы позволяет тестировать компоненты в разных визуальных контекстах и гарантировать, что стили и пропсы применяются корректно.
getByRole, getByLabelText и
toBeVisible для точной проверки UI.Unit-тестирование компонентов Chakra UI — это сочетание проверки визуального рендера, поведения пропсов, реакций на события и корректного взаимодействия с темой. Правильная организация тестов и использование контекста ChakraProvider обеспечивают стабильность и надежность компонентов при масштабировании интерфейса.