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文档