React/JestJS/Enzyme:如何测试 ref 函数?

IT技术 javascript reactjs unit-testing jestjs enzyme
2021-04-28 15:43:03

我正在使用 Jest 和 Enzyme 为这个非常简单的组件运行单元测试render()

render() {
  return (<Input
    id='foo'
    ref={input => { this.refInput = input }}
  />)
}

it('should render Input', () => {
  wrapper = shallow(<Component />)
  expect(wrapper.find(Input)).toHaveLength(1)
})

我也在使用 Jest 的覆盖选项,我看到,那条线

ref={input => { this.refInput = input }}

不在我的测试范围内。我必须做什么才能获得此示例组件的完整单元测试?

2个回答

ref 附加到组件的实例,因此您必须使用它mount来获取组件的实例。

要测试ref,请添加以下行

expect(wrapper.instance().refInput).toBeTruthy();

最后结果:

render() {
  return (<Input
    id='foo'
    ref={input => { this.refInput = input }}
  />)
}

it('should render Input', () => {
  const wrapper = mount(<Component />);
  expect(wrapper.find(Input)).toHaveLength(1)
  expect(wrapper.instance().refInput).toBeTruthy();
})

我解决了这样的问题:

const ref = React.createRef();
const props = { register: jest.fn(params => ref), label: "label text", ...params };
let wrapper = mount(
    <ThemeProvider theme={theme}>
        <Input {...props} />
    </ThemeProvider>
);
expect(wrapper.find(Entity).getElement().ref).toBe(ref);

我在输入中有实体组件,它接收 ref 函数。