Мокирование компонентов в Ant Design необходимо для упрощения разработки и тестирования интерфейсов. Библиотека предоставляет множество высокоуровневых компонентов с собственными сложными внутренними состояниями. При тестировании или при создании прототипов часто требуется заменить реальный компонент на упрощённый мок, чтобы изолировать логику приложения и избежать зависимости от сложных визуальных элементов.
Ключевые цели мокирования:
Наиболее популярным подходом является применение Jest для создания моков компонентов Ant Design совместно с React Testing Library. Основная техника заключается в замене оригинального импорта компонента на фиктивный:
import { Button } from 'antd';
jest.mock('antd', () => {
const originalModule = jest.requireActual('antd');
return {
...originalModule,
Button: (props) => <button {...props}>{props.children}</button>,
};
});
Пояснения:
jest.requireActual('antd') сохраняет все остальные
компоненты Ant Design без изменений.Button заменяется на простой HTML
<button>, сохраняя возможность передачи
props и children.Некоторые компоненты, такие как Select,
Table, DatePicker, имеют собственное состояние
и сложные события. Для них простого HTML-заменителя недостаточно —
требуется имитация API компонента:
jest.mock('antd', () => {
const originalModule = jest.requireActual('antd');
const MockSelect = ({ children, onChange, value }) => (
<sel ect value={value} onCha nge={(e) => onChange?.(e.target.value)}>
{children}
</select>
);
return {
...originalModule,
Select: MockSelect,
};
});
Особенности:
onChange вызывается с правильным
аргументом.value, что позволяет корректно
тестировать контролируемые компоненты.Для большого проекта удобно создать утилиту для мокирования любых компонентов Ant Design. Это позволяет централизованно управлять поведением мока и минимизировать повторяющийся код:
const createAntdMock = (overrides = {}) => {
const antd = jest.requireActual('antd');
const mockComponents = {};
Object.keys(antd).forEach((key) => {
mockComponents[key] = overrides[key] || ((props) => <div>{props.children}</div>);
});
return mockComponents;
};
jest.mock('antd', () => createAntdMock({
Button: (props) => <button {...props}>{props.children}</button>,
Select: ({ children, onChange, value }) => (
<select value={value} onCha nge={(e) => onChange?.(e.target.value)}>
{children}
</select>
),
}));
Преимущества такого подхода:
Иногда требуется сохранять стили компонентов Ant Design при мокировании, чтобы тесты визуально не ломались и можно было проверять классы CSS:
jest.mock('antd', () => {
const originalModule = jest.requireActual('antd');
const MockButton = (props) => <button className={`antd-btn ${props.className}`}>{props.children}</button>;
return { ...originalModule, Button: MockButton };
});
Особенности:
antd-btn, чтобы можно было
проверять наличие CSS-классов в тестах.disabled или loading, через props.Компоненты вроде Modal или notification
сложно тестировать напрямую, так как они рендерятся вне основного
DOM-дерева. Для них создаются отдельные моки:
import { notification } fr om 'antd';
jest.mock('antd', () => {
const originalModule = jest.requireActual('antd');
return {
...originalModule,
notification: {
open: jest.fn(),
success: jest.fn(),
error: jest.fn(),
},
};
});
Преимущества:
notification.success и
notification.error.value
или checked.Мокирование компонентов Ant Design является критическим инструментом при построении надёжной тестовой среды и ускоряет разработку сложных интерфейсов, позволяя сосредоточиться на логике приложения, а не на визуальных деталях.