Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you mock a react component with Jest that has props?

There has got to be a simple way to do this, but I can't find documented syntax anywhere. I have a React component with a prop that I'd like to mock in Jest like this:

jest.mock('./common/MultiSelect', 'MultiSelect');

That works, except that I end up with a React warning cluttering my test results:

Warning: Unknown prop options on tag. Remove this prop from the element.

The component I'm mocking does have an options prop, and I really don't care how it's rendered, so how can I mock it in such a way it will not throw the warning? I've tried using React.createElement in the mock, and returning an array with element name and props arguments to no end.

The component I want to mock is used like this:

<MultiSelect
options={['option 1', 'option 2']}
/>
like image 211
EMC Avatar asked Sep 05 '17 01:09

EMC


People also ask

How do you mock React a component in Jest?

To mock a React component, the most straightforward approach is to use the jest. mock function. You mock the file that exports the component and replace it with a custom implementation. Since a component is basically a function, the mock should also return a function.

Can you pass a React component as prop?

You can pass a component as props in React by using the built-in children prop. All elements you pass between the opening and closing tags of a component get assigned to the children prop. Copied!


2 Answers

You're mocking the component with a string as the second argument. That's unusual, as the jest.mock function expects a function as a second argument. The string may work for your test (depending on how it is rendered) but it's undefined behavior in Jest's documentation and is probably what is causing your problem. Instead pass a function that returns a component. Here's one that passes a simple functional component that just passes the name back:

jest.mock('./common/MultiSelect', () => () =><span>MultiSelect</span>);

like image 61
Ben McCormick Avatar answered Oct 01 '22 05:10

Ben McCormick


I find the following mock pattern useful in cases where you want to see the component name and props being provided in your Jest snapshots:

jest.mock('./common/MultiSelect', () => (props) => <mock-MultiSelect {...props} />);
like image 32
HydraHatRack Avatar answered Oct 01 '22 05:10

HydraHatRack