Javascript React中的Jest测试承诺给出TypeError:无法读取属性';最后';未定义的
我有一个子组件Javascript React中的Jest测试承诺给出TypeError:无法读取属性';最后';未定义的,javascript,reactjs,promise,jestjs,Javascript,Reactjs,Promise,Jestjs,我有一个子组件MySummary,它调用从父组件传递的函数,如下所示: submit() { this.setState({submitting: true}); this.props.handleSubmit() .finally(() => { if (!this.mounted) { return; } this.setState({submitting: false, showConfi
MySummary
,它调用从父组件传递的函数,如下所示:
submit() {
this.setState({submitting: true});
this.props.handleSubmit()
.finally(() => {
if (!this.mounted) {
return;
}
this.setState({submitting: false, showConfirmDialog: false});
});
}
< MySummary exam={exam} handleSubmit ={jest.fn()}/>
在父组件中,handleSubmit
函数返回一个promise
并在提交时重定向到另一页:
handleSubmit() {
return this.gateway.submitExam()
.then((exam) => {
this.setState(exam);
this.props.history.push('/exam/result');
});
}
在浏览器中,它似乎正在工作。尽管我认为最终不会调用,
,因为我们重定向到另一个页面,然后子组件将被卸载,但它似乎仍然到达了那个代码块。在运行该代码时,我已从finally
块登录到控制台。所以我不确定这是怎么发生的。我的问题是,我的测试失败了,我得到了错误:
TypeError:无法读取未定义的属性“finally”
在我的测试中,我单击了一个调用submit函数的按钮,然后我只是检查是否调用了handleSubmit函数:
我是这样安装组件的:
submit() {
this.setState({submitting: true});
this.props.handleSubmit()
.finally(() => {
if (!this.mounted) {
return;
}
this.setState({submitting: false, showConfirmDialog: false});
});
}
< MySummary exam={exam} handleSubmit ={jest.fn()}/>
但是,该测试给出了上面提到的错误。我假设错误来自于prop
handleSubmit
的错误实现,它只定义为jest.fn()
。如何模拟promise实现,以便使此测试正常工作?您需要模拟的函数像实际函数一样返回一个promise
。因此,请尝试将模拟的返回值设置为已解析的Promise
:
handleSubmit={jest.fn(() => Promise.resolve())}
有关更多信息,请参阅和来自Jest文档。您需要模拟函数像实际函数一样返回承诺。因此,请尝试将模拟的返回值设置为已解析的
Promise
:
handleSubmit={jest.fn(() => Promise.resolve())}
有关更多信息,请参阅和来自Jest文档