2017-05-05 73 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只在生成器完成迭代之后才能解析,因此可以确保它遍历所有迭代。