我有一段代码正在 Chai 和 Pact 中测试。它看起来像这样:
var myVerify = () => {
provider.verify().then(() => {
console.log('B verified')
done()
})
}
expect(myVerify).to.not.throw()
这可行,但需要做很多额外的工作来制作包装函数,以确保我在继续测试之前等待 Pact 的验证完成。 Pact 有一些内部状态,当它完成时会被清除。如果我只是这样称呼:
expect(provider.verify()).to.not.throw()
那么它会与其他测试冲突。
这段代码对我来说似乎工作得很好,但它非常困惑。有没有更简单的方法来实现这一点?
最佳答案
我不会推荐这种方法,因为如果确实发生了错误,它永远不会被捕获,因为 Promise 不会“抛出错误”,它们只是拒绝 Promise,您可以使用 .catch
捕获 Promise,或者作为 .then
的第二个参数。
有两种方法可以实现您想要的功能:
仅使用 Mocha :
return provider.verify().then(() => { console.log('B verified'); done(); }, () => throw new Error("B verification failed"));
在这个简单的示例中,我们没有使用 chai 来验证任何内容,因为您实际上并没有验证验证的数据输出,您只是检查 promise 是否成功,如果没有,则抛出一个错误,这将使您的测试失败。默认情况下,Mocha 能够理解 promise ,只要它们作为测试的一部分返回即可。
但是,此方法意味着包装
it
函数需要注入(inject)done
参数,我不喜欢这种做法。我喜欢的是使用:Chai 与 Chai as Promised :
您需要使用 Promised 设置 Chai
chai.use(require("chai-as-promised))
然后在您的测试中,只需执行以下操作:
return expect(provider.verify()).to.eventually.be.fulfilled;
此测试将等待 promise 返回,并且 chai 将验证它实际上已履行且未被拒绝。我发现这种语法使用起来更简单,并且使编写测试更简单。您还可以使用
Promises.all
对同一个 Promise 进行多个期望:var verify = provider.verify(); return Promises.all( expect(verify).to.eventually.be.fulfilled, expect(verify).to.eventually.be.true, );
关于node.js - 我可以使 Chai 的 Expect.to.not.throw 同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774417/