I am trying to test the render props of my React component, and have followed some advice in doing so, however it is not working.
Component:
const AppMain = () =>{
return (
<main>
Enter datapack details here.
<Formik
initialValues={{
pack_name: '',
pack_mcmeta:{
pack_format: '',
description: ''
},
data: {
}
}}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
render={({ isSubmitting }) => (
<Form className="form-container">
<MetaFields />
<Divider variant="middle"></Divider>
<Button variant="outlined" type="submit" disabled={isSubmitting}>
Submit
</Button>
</Form>
)}>
</Formik>
</main>)
}
And my test:
import Enzyme, {shallow} from 'enzyme';
import AppMain from './AppMain';
import Adapter from 'enzyme-adapter-react-16';
import { Formik } from 'formik';
Enzyme.configure({ adapter: new Adapter()})
describe('<AppMain />', () => {
let wrapper;
beforeEach(() => {
wrapper = shallow(<AppMain />);
});
it('Renders a form', () => {
const renderedForm = wrapper.renderProp('render')(false)
expect(renderedForm.exists('.form-container')).toEqual(true);
})
});
But I get this error message:
● › Renders a form
TypeError: ShallowWrapper::renderProp() can only be called on custom components 17 | }); 18 | it('Renders a form', () => { > 19 | const renderedForm = wrapper.renderProp('render')(false) | ^ 20 | expect(renderedForm.exists('.form-container')).toEqual(true); 21 | }) 22 | }); at ShallowWrapper.<anonymous> (node_modules/enzyme/build/ShallowWrapper.js:1471:19) at ShallowWrapper.single (node_modules/enzyme/build/ShallowWrapper.js:1960:25) at ShallowWrapper.renderProp (node_modules/enzyme/build/ShallowWrapper.js:1469:21) at Object.renderProp (src/AppMain.spec.js:19:38)
I have not found anything online about the error message title:
TypeError: ShallowWrapper::renderProp() can only be called on custom components
Advertisement
Answer
The error message :
TypeError: ShallowWrapper::renderProp() can only be called on custom components
Is saying that the renderProp is being run on a non-jsx element, e.g. a basic html element.
Where you thought it was running on the Formik element, it was running on main which cannot have a renderProps, so the test fails straight away.
You need to change your code to run on the Formik element.