JS:Promise resolver不是一个函数

时间:2017-11-11 16:15:31

标签: javascript reactjs jestjs

我试图运行这个jestJS单元测试,但我得到TypeError: Promise resolver undefined is not a function。我做错了什么?

it('_onSubmit() should throw error if data is missing', (done) => {
  const createUserMutation = () => new Promise()
  const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />)
  wrapper.update().find(Form).simulate('submit', {
    preventDefault: () => {}
  })
  createUserMutation.resolve().then(() => {
    expect(console.error).toHaveBeenCalled()
    done()
  })
})

2 个答案:

答案 0 :(得分:3)

new Promise()正在尝试创建一个没有执行函数*的promise。正确的用法是传入一个最多接受两个参数(resolvereject)的函数,例如:

var p = new Promise((resolve, reject) => {
    // ...code that does something, ultimately calls either resolve or reject
});

有关MDN的更多信息:

稍后,您似乎试图在promise实例上调用resolve。你也不能这样做(除非你没有使用标准的承诺)。您使用传递给执行程序的resolve函数来解决承诺。 (我尝试为您修改代码,但需要太多的上下文信息。)

*我很惊讶地看到V8的错误消息说&#34;解析器功能&#34;但我已经证实了。 The spec称它为执行者,我会想到一个&#34;解析器功能&#34;将Promise构造函数作为第一个参数传递给它的函数...

答案 1 :(得分:1)

如果你想要做的就是创建一个已解决的承诺,那就使用Promise.resolve(),它会返回一个已经解决的新承诺。

new Promise()用于将非承诺(通常是异步)代码转换为承诺,但这看起来不像你需要的那样。如果你打算使用它,你必须将一个函数传递给它(正如Felix Kling和TJ Crowder已经注意到的那样)。

更多要点:

  • 您将createUserMutation定义为一个函数,因此在您使用它之后需要几行,您需要使用() 调用它。或者你可以选择让它不是一个功能,因为看起来你想要做的就是产生一个承诺。
  • 另外,正如Felix Kling指出的那样,承诺没有resolve()方法。您只需就.then()生成的承诺致电Promise.resolve()