我试图运行这个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()
})
})
答案 0 :(得分:3)
new Promise()
正在尝试创建一个没有执行函数*的promise。正确的用法是传入一个最多接受两个参数(resolve
和reject
)的函数,例如:
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
定义为一个函数,因此在您使用它之后需要几行,您需要使用()
调用它。或者你可以选择让它不是一个功能,因为看起来你想要做的就是产生一个承诺。resolve()
方法。您只需就.then()
生成的承诺致电Promise.resolve()
。