Для полноценного E2E-тестирования компонентов, созданных с использованием Chakra UI, необходимо обеспечить правильную интеграцию с тестовым окружением. Обычно используется сочетание Cypress или Playwright для браузерного тестирования вместе с тестовым рендерингом React-компонентов.
Установка Cypress производится командой:
npm install cypress --save-dev
Для Playwright:
npm install @playwright/test --save-dev
Важно убедиться, что приложение корректно запускается в тестовом окружении, и Chakra Provider оборачивает корневой компонент, чтобы все темы и стили были доступны в тестах.
import { ChakraProvider } from "@chakra-ui/react";
import theme from "./theme";
export const AppWrapper = ({ children }) => (
<ChakraProvider theme={theme}>{children}</ChakraProvider>
);
При тестировании отдельных компонентов в изоляции стоит использовать
mount или
render с оберткой ChakraProvider. Для
Cypress есть плагин cypress-react-unit-test, а для
Playwright — возможность рендерить компоненты через
@testing-library/react.
Пример с Cypress:
import { mount } from 'cypress/react18';
import { Button } from '@chakra-ui/react';
import { ChakraProvider } from '@chakra-ui/react';
it('рендерит кнопку с правильным текстом', () => {
mount(
<ChakraProvider>
<Button colorScheme="teal">Click Me</Button>
</ChakraProvider>
);
cy.get('button').should('have.text', 'Click Me');
});
Пример с Playwright + Testing Library:
import { test, expect } from '@playwright/test';
import { render } from '@testing-library/react';
import { ChakraProvider, Button } from '@chakra-ui/react';
test('кнопка отображается с текстом', async () => {
const { getByText } = render(
<ChakraProvider>
<Button colorScheme="blue">Submit</Button>
</ChakraProvider>
);
expect(getByText('Submit')).toBeTruthy();
});
Chakra UI строит интерфейсы на основе темы, что требует проверки E2E функционала с различными цветовыми схемами и режимами (light/dark). Для этого создается отдельный тестовый рендер с кастомной темой:
import { extendTheme, ChakraProvider, Button } from '@chakra-ui/react';
const customTheme = extendTheme({
colors: {
brand: {
500: '#1a365d',
},
},
});
mount(
<ChakraProvider theme={customTheme}>
<Button colorScheme="brand">Custom Button</Button>
</ChakraProvider>
);
Компоненты Chakra UI часто используют хук useDisclosure,
useToast или модальные окна. В E2E-тестах важно
симулировать действия пользователя: клики, фокус, закрытие модальных
окон.
Пример модального окна:
import { Button, Modal, ModalOverlay, ModalContent, ModalHeader, ModalBody, ModalFooter, useDisclosure, ChakraProvider } from "@chakra-ui/react";
function TestModal() {
const { isOpen, onOpen, onClose } = useDisclosure();
return (
<ChakraProvider>
<Button onCl ick={onOpen}>Open Modal</Button>
<Modal isOpen={isOpen} onCl ose={onClose}>
<ModalOverlay />
<ModalContent>
<ModalHeader>Header</ModalHeader>
<ModalBody>Body Content</ModalBody>
<ModalFooter>
<Button onCl ick={onClose}>Close</Button>
</ModalFooter>
</ModalContent>
</Modal>
</ChakraProvider>
);
}
// Cypress E2E тест
cy.get('button').contains('Open Modal').click();
cy.get('[role="dialog"]').should('be.visible');
cy.get('button').contains('Close').click();
cy.get('[role="dialog"]').should('not.exist');
Chakra UI использует анимации через framer-motion. Для
E2E важно корректно ожидать завершение анимаций. В Cypress можно
использовать cy.wait() или проверять видимость через
should('be.visible'). В Playwright применяются
await page.waitForSelector('[selector]') с опцией
state: 'visible'.
Компоненты FormControl, Input, Select и другие требуют проверки состояния ошибки и взаимодействий с пользователем.
import { FormControl, FormLabel, Input, FormErrorMessage, ChakraProvider } from "@chakra-ui/react";
import { useState } from "react";
function TestForm() {
const [value, setValue] = useState("");
const isError = value === "";
return (
<ChakraProvider>
<FormControl isInvalid={isError}>
<FormLabel>Имя</FormLabel>
<Input value={value} onCha nge={(e) => setValue(e.target.value)} />
{isError && <FormErrorMessage>Поле обязательно</FormErrorMessage>}
</FormControl>
</ChakraProvider>
);
}
// Cypress
cy.get('input').clear();
cy.get('input').blur();
cy.contains('Поле обязательно').should('be.visible');
Для автоматизации E2E-тестов Chakra UI интегрируют с CI/CD пайплайнами. Cypress и Playwright поддерживают headless режим, что позволяет запускать тесты без графического интерфейса. Для стабильности тестов рекомендуется:
Такая организация обеспечивает детальное покрытие функционала компонентов Chakra UI и предотвращает регрессии при обновлении библиотеки или темы.