I don't really know how to mock inline function in react component's child
My stack: sinon
, chai
, enzyme
;
Component usage:
<ListItem onClick={() => someFn()} />
Component's render:
render() {
return (
<li>
<a href="#" onClick={e => {
e.preventDefault();
this.props.onClick();
}}
> whatever </a>
</li>
);
}
Here we have onClick
that calls e.preventDefault()
. How to tell for <a href>
(link
) to not call e.preventDefault()
? How can I mock that onClick
?
Below what I have try in tests:
Shallow copy setup
function setup() {
const someFn = sinon.stub();
const component = shallow(
<ListItem
onClick={() => {
someFn();
}}
/>
);
return {
component: component,
actions: someFn,
link: component.find('a'),
listItem: component.find('li'),
}
}
And the test
it('simulates click events', () => {
const { link, actions } = setup();
link.simulate('click'); //Click on <a href>
expect(actions).to.have.property('callCount', 1); //would be good if we'll remove e.preventDefault()
});
Test's output error:
TypeError: Cannot read property 'preventDefault' of undefined
Just to note that this is an issue only when using
shallow
enzyme renderer. In case of full DOM renderermount
, the event object contains thepreventDefault
method, therefore you don't have to mock it.Try this
For those using Jest and
react-testing-library
sfireEvent
, you need to provide an initialised event object, otherwise the event can't be dispatched via your element.One can then assert on
e.preventDefault
being called by assigning a property to that initialised event:Similarly for
stopPropagation
.Anton Karpenko's answer for Jest was useful.
I would suggest to create new object based on jest.fn() with
then use it: