2017-11-11 251 views
1

我試圖運行這個jestJS單元測試,但我確實得到了TypeError: Promise resolver undefined is not a function。我究竟做錯了什麼?JS:Promise解析器不是函數

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

Promise構造函數需要一個函數。並且promise實例沒有'resolve'方法。 –

+1

我正在試圖弄清楚這個測試應該如何工作,非常困難。您能否引導我們瞭解導致此代碼的思維過程以及您嘗試使用諾言的原因? – JLRishe

+0

爲什麼你在這裏使用promise?哪部分代碼是異步的? – Bergi

回答

2

new Promise()正試圖創建一個沒有執行程序函數*的承諾。正確的用法是在接受最多兩個參數(resolvereject),例如一個函數來傳遞:

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

更多關於MDN:

之後,您似乎試圖在promise實例上調用resolve。你不能這樣做(除非你不使用標準承諾)。您使用傳入執行器的函數來解析承諾。 (我試圖修改代碼給你,但需要太多的背景信息。)


*我很驚訝地看到V8的錯誤消息說「解析器功能」,但我已經驗證它。 The spec稱它是一個執行者,我會認爲一個「解析器函數」將構造函數作爲第一個參數傳遞給它的函數...

+0

但我不明白如何讓'resolve()。then()'進入Promise ... – user3142695

+0

@ user3142695:恐怕我無法關注你的代碼。通常,所有的行爲都發生在承諾執行者的內部,但是在你的情況下,它包裹在一個箭頭函數中;不知道更多關於您的項目的信息恐怕我無法真正解釋如何更新該代碼。儘管如此,請參閱鏈接文章(我已經添加了第二篇文章),以獲取有關如何使用承諾的更多信息。 –

1

如果你只想創建一個解決的承諾,那麼使用Promise.resolve(),它返回一個新的,已經解決的承諾。

new Promise()是用於將非承諾(通常是異步)代碼轉換爲承諾,但它看起來並不像你需要的那樣。如果你打算使用它,你必須傳遞一個函數(就像Felix Kling和TJ Crowder已經注意到的那樣)。

一些積分:

  • 您正在定義createUserMutation的功能,當你使用它這麼幾行字後,你就需要把它用()通話。或者你可以選擇讓它不是一個功能,因爲看起來你在這裏試圖做的是產生一個承諾。
  • 另外,正如Felix Kling指出的,承諾沒有resolve()方法。你可以致電.then()Promise.resolve()產生的承諾。
+0

FWIW,重新設置你的第一個要點,我懷疑它是正確的:她/他傳遞函數而不是它的結果,作爲的道具(可能在變異用戶時可以調用它)。 (但顯然我們需要更多的上下文來確保任何方式。) –