2017-05-05 72 views
1

我試圖測試發電機應始終拋出異常測試薛寶釵:如何與異常收益率產生

function* failureFunc() { 
    yield* getThing('blabla'); //throws an error 
} 

我應該如何建立薛寶釵期望/應該表達是否正確? 到目前爲止,我無法得到表達工作,我曾嘗試:

chai.expect(yield* failureFunc()).to.throw(Error); 
chai.expect(yield* failureFunc()).to.be.rejectedWith(Error); 

嘗試也增加了一些柴發電機功能。 似乎沒有任何工作。 不確定構建此表達式的正確方法是什麼。

回答

0

你必須重複生成器。這裏有方法可以做到這一點:

const chai = require("chai"); 
const cap = require("chai-as-promised"); 
const Promise = require("bluebird"); 

chai.use(cap); 

function* failureFunc() { 
    yield* getThing('blabla'); // Throws an error, because getThing is not defined. 
} 

chai.expect(() => Array.from(failureFunc())).to.throw(Error); 
chai.expect(Promise.coroutine(failureFunc)()).to.be.rejectedWith(Error); 

在第一種情況下,我使用Array.from將嘗試遍歷整個發電機。通過這樣做,您可以在任何迭代中捕獲錯誤。 (理論上,發生器可以在任何迭代週期中拋出。)可以使用遍歷整個生成器的任何方法。或者如果您正在測試第一次迭代失敗的情況,您可以在() => failureFunc().next()上進行測試。

在第二種情況下,我使用Bluebird的Promise.coroutine將生成器轉換爲函數,該函數返回一個promise並檢查promise是否被拒絕。由於promise只在生成器完成迭代之後才能解析,因此可以確保它遍歷所有迭代。