2017-10-16 167 views
1

我有一段我正在Chai和Pact中測試的代碼片段。它看起來是這樣的:我可以讓柴的expect.to.not.throw同步嗎?

 var myVerify =() => { 
     provider.verify().then(() => { 
      console.log('B verified') 
      done() 
     }) 
     } 
     expect(myVerify).to.not.throw() 

這工作,但它的很多額外的工作經歷,使包裝的功能,以確保我等候條約的驗證完整的持續與試驗前。協議有一些內部狀態,完成後會清除。如果我只是把這個:

預期(provider.verify())to.not.throw()

那麼它將與其他測試衝突。

這段代碼似乎對我很好,但它非常混亂。它有一個更簡單的方法來完成這個?

回答

1

我不會推薦這種方法,因爲如果事實上發生了錯誤,它永遠不會被捕獲,因爲承諾不會「拋出錯誤」,它們只是拒絕承諾,您可以使用.catch捕獲.then的第二個參數。

這樣做有2種方式,你想要什麼:

1)剛剛與摩卡:

return provider.verify().then(() => { 
     console.log('B verified'); 
     done(); 
},() => throw new Error("B verification failed")); 

在這個簡單的例子,我們沒有使用柴,因爲你不驗證什麼實際驗證驗證的數據輸出,你只是檢查,看看承諾是否成功,如果沒有,拋出一個錯誤,這將失敗你的測試。默認情況下,只要它們作爲測試的一部分返回,摩卡就會理解承諾。

但是,這種方法意味着包裝it功能需要注入done參數,我不是一個粉絲。我所使用的粉絲:

2)柴與Chai as Promised

您需要設置薛寶釵爲使用

chai.use(require("chai-as-promised)) 
在測試中

然後答應了,簡單地做:

return expect(provider.verify()).to.eventually.be.fulfilled; 

這個測試將等待返回的承諾,並且chai將驗證它實際上已經完成並且未被拒絕。我發現這個語法更簡單易用,並且使得編寫測試變得更簡單。您也可以有同樣的承諾多預計,使用Promises.all

var verify = provider.verify(); 
return Promises.all(
    expect(verify).to.eventually.be.fulfilled, 
    expect(verify).to.eventually.be.true, 
); 
+0

甚至更​​簡潔:'返回provider.verify(),然後(做,()=>拋出新的錯誤(「B驗證失敗」 ));' 但是,'承諾'是要走的路。 –

+0

@MatthewFellows我不能推薦你的方法,因爲如果驗證函數返回一些東西(我認爲它),它會調用'done',這個摩卡將會把它解釋爲一個錯誤信息,這將會使測試失敗。 –

+0

除了空洞的成功承諾之外,它不應該返回任何東西。 –

相關問題