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