I have React function component that has a ref on one of its children. The ref is created via useRef
.
I want to test the component with the shallow renderer. I have to somehow mock the ref to test the rest of the functionality.
I can't seem to find any way to get to this ref and mock it. Things I have tried
Accessing it via the childs property. React does not like that, since ref is not really a props
Mocking useRef. I tried multiple ways and could only get it to work with a spy when my implementation used
React.useRef
I can't see any other way to get to the ref to mock it. Do I have to use mount in this case?
I can't post the real scenario, but I have constructed a small example
it('should test', () => {
const mock = jest.fn();
const component = shallow(<Comp onHandle={mock}/>);
// @ts-ignore
component.find('button').invoke('onClick')();
expect(mock).toHaveBeenCalled();
});
const Comp = ({onHandle}: any) => {
const ref = useRef(null);
const handleClick = () => {
if (!ref.current) return;
onHandle();
};
return (<button ref={ref} onClick={handleClick}>test</button>);
};
mount
instead asshallow
dont support refs – IndustrialsuseRef
is not replacement forReact.createRef
– Kakaref
? if using in component's logic or event handler? or do you want to pass it outside? anyway you need to initialize ref withReact.createRef
regardless if it's creating on each render or saving between renders by usinguseRef
– KakauseImperativeHandle
to mock useRef in your tests. – Evasive