Enzyme является мощной библиотекой для тестирования React-компонентов, предоставляя простые и удобные методы для рендеринга, взаимодействия и ассертов. В контексте тестирования компонентов, использующих фреймворк Bootstrap, Enzyme предоставляет все необходимые инструменты для проверки визуального состояния компонентов, их взаимодействия и правильности работы в сочетании с CSS-классами и стилями.
Прежде чем приступить к тестированию компонентов Bootstrap, необходимо настроить проект. Это включает установку зависимостей для React, Enzyme и адаптера для React.
npm install --save react react-dom
npm install --save-dev enzyme enzyme-adapter-react-16 jest
Создайте файл setupTests.js в корне проекта и добавьте
код для инициализации Enzyme:
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });
Enzyme предоставляет несколько методов для рендеринга и тестирования
компонентов: shallow, mount, и
render. Каждый из этих методов имеет свое применение в
зависимости от уровня тестирования:
shallow рендерит компонент на одном
уровне, не углубляясь в дочерние компоненты.mount выполняет полный рендеринг
компонента вместе с дочерними компонентами.render создает статичный HTML, который
можно использовать для проверки вывода.Для тестирования компонентов, использующих Bootstrap, чаще всего
используется метод shallow, так как он достаточно для
проверки корректности отображения элементов и работы с классами
Bootstrap.
Предположим, что необходимо протестировать компонент, использующий кнопки из Bootstrap. Рассмотрим следующий компонент:
import React from 'react';
const ButtonComponent = () => (
<button className="btn btn-primary">Click me</button>
);
export default ButtonComponent;
Для тестирования этого компонента можно использовать Enzyme,
проверив, что кнопка имеет правильный класс
btn btn-primary.
import React from 'react';
import { shallow } from 'enzyme';
import ButtonComponent from './ButtonComponent';
describe('ButtonComponent', () => {
it('должен рендерить кнопку с классом "btn btn-primary"', () => {
const wrapper = shallow(<ButtonComponent />);
expect(wrapper.find('button').hasClass('btn btn-primary')).toBe(true);
});
});
Этот тест проверяет, что компонент рендерит кнопку с нужными классами, которые используются для стилизации в Bootstrap.
Многие компоненты Bootstrap имеют интерактивные элементы, такие как модальные окна, карусели и всплывающие подсказки. Например, рассмотрим компонент модального окна:
import React, { useState } from 'react';
const ModalComponent = () => {
const [show, setShow] = useState(false);
const toggleModal = () => setShow(!show);
return (
<>
<button className="btn btn-primary" onCl ick={toggleModal}>
Open Modal
</button>
{show && (
<div className="modal show" tabIndex="-1" role="dialog">
<div className="modal-dialog">
<div className="modal-content">
<div className="modal-header">
<h5 className="modal-title">Modal title</h5>
<button type="button" className="close" onCl ick={toggleModal}>
<span>×</span>
</button>
</div>
<div className="modal-body">
<p>Modal content</p>
</div>
</div>
</div>
</div>
)}
</>
);
};
export default ModalComponent;
Тестирование этого компонента с использованием Enzyme может включать проверку, открывается ли модальное окно при нажатии на кнопку:
import React from 'react';
import { shallow } from 'enzyme';
import ModalComponent from './ModalComponent';
describe('ModalComponent', () => {
it('должен открывать модальное окно при клике на кнопку', () => {
const wrapper = shallow(<ModalComponent />);
expect(wrapper.find('.modal').length).toBe(0); // модальное окно не отображается изначально
wrapper.find('button').simulate('click');
expect(wrapper.find('.modal').length).toBe(1); // модальное окно появляется после клика
});
});
Этот тест проверяет, что при клике на кнопку появляется модальное окно, и скрывается оно по умолчанию.
Когда компоненты Bootstrap используются вместе с кастомными стилями, важно убедиться, что стили правильно применяются. Например, компонент, использующий кастомные стили, может выглядеть так:
import React from 'react';
const CustomCard = () => (
<div className="card" style={{ backgroundColor: 'lightblue' }}>
<div className="card-body">
<h5 className="card-title">Card title</h5>
<p className="card-text">Some quick example text to build on the card title.</p>
</div>
</div>
);
export default CustomCard;
Тестирование этого компонента на наличие кастомного стиля можно осуществить следующим образом:
import React from 'react';
import { shallow } from 'enzyme';
import CustomCard from './CustomCard';
describe('CustomCard', () => {
it('должен иметь стиль backgroundColor: lightblue', () => {
const wrapper = shallow(<CustomCard />);
expect(wrapper.find('.card').prop('style')).toHaveProperty('backgroundColor', 'lightblue');
});
});
В этом тесте проверяется, что компонент использует правильный кастомный стиль фона.
Для того чтобы тесты работали корректно, важно использовать Jest вместе с Enzyme. Jest предоставляет возможности для асинхронных тестов, мокирования функций и контроля состояния компонентов. Например, тестирование компонентов с динамическим изменением состояния или асинхронной загрузкой данных:
import React, { useState, useEffect } from 'react';
const AsyncComponent = () => {
const [data, setData] = useState(null);
useEffect(() => {
setTimeout(() => {
setData('Loaded data');
}, 1000);
}, []);
return (
<div className="alert alert-success" role="alert">
{data || 'Loading...'}
</div>
);
};
export default AsyncComponent;
Для тестирования компонента с асинхронной логикой можно использовать Jest с Enzyme:
import React from 'react';
import { shallow } from 'enzyme';
import AsyncComponent from './AsyncComponent';
describe('AsyncComponent', () => {
it('должен показывать данные после загрузки', () => {
jest.useFakeTimers();
const wrapper = shallow(<AsyncComponent />);
expect(wrapper.text()).toBe('Loading...');
jest.runAllTimers(); // Симулируем завершение таймера
wrapper.update();
expect(wrapper.text()).toBe('Loaded data');
});
});
В этом тесте используется Jest для симуляции таймеров, что позволяет проверить, как компонент обновляется после получения данных.
Тестирование компонентов Bootstrap с использованием Enzyme позволяет проверять правильность их рендеринга, стилизации и функциональности в рамках React-приложений. Enzyme обеспечивает гибкость для работы с интерактивными компонентами, такими как модальные окна или динамически изменяющиеся элементы. Комбинированное использование Enzyme и Jest делает процесс тестирования удобным и эффективным, позволяя убедиться в корректности работы интерфейса и взаимодействия с пользователем.