Ant Design — один из самых популярных UI-фреймворков для React, предоставляющий множество готовых компонентов для создания интерфейсов. Однако, как и любые другие компоненты, они требуют тщательного тестирования, чтобы обеспечить их правильную работу. Enzyme, инструмент для тестирования компонентов React, идеально подходит для этих целей. В этой статье будет рассмотрено, как работать с компонентами Ant Design в Enzyme и какие особенности при этом следует учитывать.
Для тестирования компонентов Ant Design с помощью Enzyme необходимо установить несколько пакетов:
Установка всех зависимостей:
npm install --save enzyme enzyme-adapter-react-16 ant-design
После установки зависимостей необходимо настроить Enzyme, указав подходящий адаптер. Например, для React 16 это будет выглядеть так:
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });
Ant Design предоставляет множество компонентов, таких как кнопки,
формы, таблицы, модальные окна и т.д. Каждый из этих компонентов имеет
свои особенности, и тестирование их может отличаться от стандартных
React-компонентов. Рассмотрим на примере тестирование компонента
Button.
Для начала рассмотрим компонент Button, который мы будем
тестировать:
import React from 'react';
import { Button } from 'antd';
const MyButton = () => {
return <Button type="primary">Click me</Button>;
};
export default MyButton;
Тестирование компонента Button можно начать с проверки его рендеринга и наличия нужных пропсов.
import React from 'react';
import { shallow } from 'enzyme';
import MyButton from './MyButton';
import { Button } from 'antd';
describe('MyButton', () => {
it('должен рендерить кнопку', () => {
const wrapper = shallow(<MyButton />);
expect(wrapper.find(Button).length).toBe(1);
});
it('должен иметь правильный текст', () => {
const wrapper = shallow(<MyButton />);
expect(wrapper.find(Button).text()).toBe('Click me');
});
it('должен иметь тип primary', () => {
const wrapper = shallow(<MyButton />);
expect(wrapper.find(Button).prop('type')).toBe('primary');
});
});
Ант-дизайн компоненты часто содержат сложную логику взаимодействия, такую как обработка кликов, изменения состояний и т.д. Поэтому важно не только проверить рендеринг, но и протестировать поведение компонента при различных действиях.
Модальные окна (Modal) — один из ключевых компонентов
Ant Design, часто используемых в приложениях. Рассмотрим пример, где
модальное окно появляется при нажатии на кнопку.
import React, { useState } from 'react';
import { Button, Modal } from 'antd';
const MyModal = () => {
const [visible, setVisible] = useState(false);
const showModal = () => {
setVisible(true);
};
const handleOk = () => {
setVisible(false);
};
const handleCancel = () => {
setVisible(false);
};
return (
<>
<Button type="primary" onCl ick={showModal}>
Open Modal
</Button>
<Modal title="Test Modal" visible={visible} onOk={handleOk} onCan cel={handleCancel}>
<p>Some contents...</p>
</Modal>
</>
);
};
export default MyModal;
Теперь, чтобы протестировать это поведение, необходимо проверить, что модальное окно открывается при нажатии на кнопку и закрывается после нажатия кнопки “Ok” или “Cancel”.
import React from 'react';
import { shallow } from 'enzyme';
import MyModal from './MyModal';
import { Button, Modal } from 'antd';
describe('MyModal', () => {
it('должен открыть модальное окно при нажатии на кнопку', () => {
const wrapper = shallow(<MyModal />);
expect(wrapper.find(Modal).prop('visible')).toBe(false);
// Нажатие на кнопку
wrapper.find(Button).simulate('click');
expect(wrapper.find(Modal).prop('visible')).toBe(true);
});
it('должен закрыть модальное окно при нажатии на кнопку Ok', () => {
const wrapper = shallow(<MyModal />);
wrapper.find(Button).simulate('click');
expect(wrapper.find(Modal).prop('visible')).toBe(true);
// Нажатие на кнопку Ok
wrapper.find(Modal).props().onOk();
expect(wrapper.find(Modal).prop('visible')).toBe(false);
});
it('должен закрыть модальное окно при нажатии на кнопку Cancel', () => {
const wrapper = shallow(<MyModal />);
wrapper.find(Button).simulate('click');
expect(wrapper.find(Modal).prop('visible')).toBe(true);
// Нажатие на кнопку Cancel
wrapper.find(Modal).props().onCancel();
expect(wrapper.find(Modal).prop('visible')).toBe(false);
});
});
Ant Design компоненты часто принимают различные callback-функции в качестве пропсов, которые могут быть использованы для обработки событий, таких как изменение значений, клики по кнопкам и другие взаимодействия. При тестировании таких компонентов важно убедиться, что эти функции вызываются корректно.
Рассмотрим пример с компонентом Select, который
позволяет выбрать элемент из списка:
import React, { useState } from 'react';
import { SELECT } from 'antd';
const { Option } = Select;
const MySelect = () => {
const [value, setValue] = useState(null);
const handleChange = (newValue) => {
setValue(newValue);
};
return (
<SELECT defaultValue="option1" onCha nge={handleChange}>
<Option value="option1">Option 1</Option>
<Option value="option2">Option 2</Option>
</Select>
);
};
export default MySelect;
Тестирование такого компонента требует проверки, что функция
handleChange вызывается при изменении значения в
Select.
import React FROM 'react';
import { shallow } FROM 'enzyme';
import MySelect from './MySelect';
import { SELECT } FROM 'antd';
describe('MySelect', () => {
it('должен вызывать handleChange при изменении значения', () => {
const wrapper = shallow(<MySelect />);
const instance = wrapper.instance();
const spy = jest.spyOn(instance, 'handleChange');
// Эмуляция изменения значения
wrapper.find(Select).simulate('change', 'option2');
expect(spy).toHaveBeenCalledWith('option2');
});
});
При работе с компонентами Ant Design важно учитывать некоторые особенности:
Form, Table, Modal и
другие, содержат в себе вложенные элементы, что может требовать более
сложных тестов с несколькими уровнями вложенности.jest или
react-testing-library.Тестирование компонентов Ant Design с использованием Enzyme позволяет убедиться в корректной работе интерфейса, особенно при взаимодействиях, изменении состояния и проверке событий. Знание особенностей компонентов и правильная настройка тестов помогут создать стабильные и надежные тесты для сложных интерфейсов, построенных с использованием Ant Design.