ReactJS Ant 设计选择组件模拟更改事件

AMT*_*rky 7 unit-testing reactjs jestjs enzyme antd

拥有一个包含Select Ant 组件的组件 MyComp并愿意测试 MyComp 以确保处理程序正确并被调用

class MyComp extends Component {
    constructor(props) {
        super(props);
        this.handleChange = this.handleChange.bind(this);
    }

    handleChange(value) {
        this.props.doSomething();
    }

    render() {
        return (
            <Select onChange={this.props.handleChange}>
                <Option value={"Op0"} >Opt0</Option>
                <Option value={"Op1"} >Opt1</Option>
                <Option value={"Op2"} >Opt2</Option>
            </Select>
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够按如下方式对其进行测试:

it('calls the right callback', () => {
    const Option = Select.Option;
    const mockHandler = jest.fn();
    const wrapper = mount(<MyComp handleChange ={mockHandler}/>);
    let select = wrapper.find(Select);
    select.simulate("onChange"); // also tried 'change'
    expect(mockHandler).toHaveBeenCalled()
});
Run Code Online (Sandbox Code Playgroud)

请记住它是“mount”而不是浅的,所以它实际上渲染了子组件

zer*_*ewl 1

作为一种方法,您可以使用

select.prop('onChange')()
Run Code Online (Sandbox Code Playgroud)

代替select.simulate


另外,您可以打开 antd 选择菜单,检查值并继续测试(取决于所使用的 antd 版本)。

在 antd V3 中你可以使用一个简单的fireEvent.click

// Opens the Drop down
fireEvent.click(getByText("Value 1"));
Run Code Online (Sandbox Code Playgroud)

但是使用antd V4你需要使用mouseDowncall

const elt = getByTestId('your-select-test-id').firstElementChild;
fireEvent.mouseDown(elt); // THIS WILL OPEN THE SELECT !
expect(getByText('Option from Select')).toBeInTheDocument(); // WORKS !
Run Code Online (Sandbox Code Playgroud)

请参阅具体的github 问题