reactjs - 函数内部的 Jest 模拟函数

标签 reactjs jestjs enzyme

所以我正在尝试测试是否在我的表单上调用了句柄提交函数。它达到了如下所示的条件并阻止提交表单。我将如何模拟内部的验证函数以返回一个空对象 {}。这将使我的表格有效,然后按要求提交。

Validate 在 form.jsx 中的 Form 组件之外定义。我将其导出为 export const validate = {}

    handleSubmit = event => {
        const {args} = this.state;
        let errors = validate(args);
        const isValid = isEmpty(errors)
        if(!isValid) {
            this.setState({args: args})
            event.preventDefault()
        }
        this.setState({args: args})
    }


我的尝试

    it('should handleSubmit when form is submitted', () => {
        const fakeValidate = { validate: () => true };
        const handleSubmit = jest.fn().mockImplementation((cb) => () => cb({ test: 'test' }));
        const wrapper = shallow(<Form form="test" onSubmit={handleSubmit}/>);
        wrapper.find('form').simulate('submit', fakeValidate);
        expect(handleSubmit).toBeCalledTimes(1);
    });


谢谢!

最佳答案

无法模拟在其使用的同一模块中定义的函数。为了可模拟,它应该从另一个模块导入并使用 jest.mock 模拟, 或用作某些对象的方法并用 jest.spyOn 模拟.

由于它与类组件一起使用,因此可以将其定义为方法:

validate() {...}

handleSubmit = event => {
    ...
    let errors = this.validate(args);
    ...
}

并在类里面被 mock :
jest.spyOn(Form.prototype, 'validate').mockReturnValue(...);

或组件实例:
jest.spyOn(wrapper.instance(), 'validate').mockReturnValue(...);

万一validate可重用或与功能组件一起使用,它应该移动到另一个模块。

关于reactjs - 函数内部的 Jest 模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249609/

相关文章:

javascript - 确保尽早评估某一行代码

javascript - 如何使用 Jest 模拟 DynamoDBDocumentClient 构造函数(AWS 开发工具包 V3)

javascript - 使用 Jest 和 Enzyme,如何测试通过 props 传入的函数?

javascript - 为什么 enzyme 在一条线上找到一个节点,然后在下一条线上找不到

javascript - 为什么 useState 不在单元测试(Jest、Enzyme)中重新渲染组件?

javascript - 将 onClick 元素绑定(bind)到 React 组件以实现远程 API

javascript - 如何将 azure 广告集成到使用 azure 中的 REST API 的 React Web 应用程序中

javascript - 如何在 React Bootstrap 上将函数附加到 Dropdown.Toggle?

reactjs - 使用测试工具在reactjs组件上调用setState不重新渲染组件

javascript - '命令未找到 : jest'