Я рекомендую следовать подходу, описанному в документации , и экспортировать подключенный компонент как экспорт default
для использования в приложении, а также экспортировать сам компонент как именованный экспорт для тестирования.
Для кода выше export
класс App
и проверка клика следующим образом:
import * as React from 'react';
import { shallow } from 'enzyme';
import { App } from './code';
describe('App', () => {
it('should call props.onClick() when button is clicked', () => {
const onClick = jest.fn();
const wrapper = shallow(<App onClick={onClick} />);
wrapper.find('button').simulate('click');
expect(onClick).toHaveBeenCalledTimes(1);
});
});
shallow
предоставляет все необходимое для тестирования самого компонента. (shallow
даже вызывает методы жизненного цикла React с Enzyme
v3)
Как вы обнаружили, для полного рендеринга компонента требуется фиктивное redux
хранилище и обертывание компонента в Provider
. Помимо большей сложности, этот подход также завершает тестирование фиктивного хранилища и всех дочерних компонентов во время модульных тестов компонентов.
Я считаю, что гораздо эффективнее напрямую протестировать компонент, а также экспортировать и напрямую тестировать mapStateToProps()
и mapDispatchToProps()
, что очень просто, поскольку они должны быть чистыми функциями .
mapDispatchToProps()
в приведенном выше коде можно проверить следующим образом:
describe('mapDispatchToProps', () => {
it('should dispatch actions.onClick() when onClick() is called', () => {
const dispatch = jest.fn();
const props = mapDispatchToProps(dispatch);
props.onClick();
expect(dispatch).toHaveBeenCalledWith(actions.onClick());
});
});
Этот подход делает модульное тестирование компонента очень простым, поскольку вы можете напрямую передавать реквизиты компонента, и очень просто проверить, что компоненту будут переданы правильные реквизиты чистыми функциями ( или объектами ). ) передано connect()
.
Это гарантирует, что модульные тесты просты и целенаправленны. Проверка того, что connect()
и redux
работают правильно с компонентом, и все его дочерние компоненты при полной визуализации DOM могут быть выполнены в тестах e2e
.