Я попробовал ваш код, но изменил shallow rendering
на full DOM rendering
, используя mount
, и все работает нормально:
import React from 'react';
import {shallow, mount} from 'enzyme';
import ToggleSideNavComponent from './ToggleSideNavComponent';
function setup() {
const props = {
handleSideNavToggle: jest.fn()
};
return {
props: props,
wrapper: mount(<ToggleSideNavComponent {...props} />)
};
}
describe('ToggleSideNavComponent', () => {
it('should have menu icon', () => {
const component = setup();
expect(component.wrapper.find('a #menu').length).toBe(1);
component.wrapper.find('#toggle_sidebar_btn #menu').simulate('click');
expect(component.props.handleSideNavToggle).toHaveBeenCalled();
component.wrapper.unmount(); // don't forget to use unmount() after mounting
});
});
похоже, что есть проблема с доступом к props
при использовании shallow rendering
Если вы хотите только протестировать поведение функции handleSideNavToggle
(просто модульное тестирование этой функции), тогда я не рекомендую делать это с помощью simulate
, потому что вам не нужно тестировать проводку событий React или браузер вместо этого вы могли бы отрисовать родительский компонент, который предоставляет эту функцию prop вашему компоненту ToggleSideNavComponent
, и вызвать этот метод, используя подходящие аргументы и утверждать результаты, например:
describe('ToggleSideNavComponentParent', () => {
it('test parent component function', () => {
const wrapper = shallow(<ToggleSideNavComponentParent/>);
const instance = wrapper.instance();
let e = prepareSuitableEventObject();
instance.handleSideNavToggle(e);
// do your assertions here
});
});
function prepareSuitableEventObject() {
// construct an object and return it
}