我可以让柴的expect.to.not.throw同步吗?
问题描述:
我有一段我正在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()
那么它将与其他测试冲突。
这段代码似乎对我很好,但它非常混乱。它有一个更简单的方法来完成这个?
答
我不会推荐这种方法,因为如果事实上发生了错误,它永远不会被捕获,因为承诺不会“抛出错误”,它们只是拒绝承诺,您可以使用.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,
);
甚至更简洁:'返回provider.verify(),然后(做,()=>抛出新的错误(“B验证失败” ));' 但是,'承诺'是要走的路。 –
@MatthewFellows我不能推荐你的方法,因为如果验证函数返回一些东西(我认为它),它会调用'done',这个摩卡将会把它解释为一个错误信息,这将会使测试失败。 –
除了空洞的成功承诺之外,它不应该返回任何东西。 –