我正在努力寻找在使用 async/await 时验证承诺在 Mocha 测试中被拒绝的最佳方法。
这是一个有效的示例,但我不喜欢 should.be.rejectedWith
返回一个需要从测试函数返回才能正确评估的承诺。使用 async/await 消除了对测试值的这一要求(就像我对下面 wins()
的结果所做的那样),我觉得我可能会在某些时候忘记 return 语句,在这种情况下测试总会通过。
// Always succeeds
function wins() {
return new Promise(function(resolve, reject) {
resolve('Winner');
});
}
// Always fails with an error
function fails() {
return new Promise(function(resolve, reject) {
reject('Contrived Error');
});
}
it('throws an error', async () => {
let r = await wins();
r.should.equal('Winner');
return fails().should.be.rejectedWith('Contrived Error');
});
感觉应该可以使用 async/await 将拒绝转换为异常并将其与 Chai 的 should.throw 相结合的事实,但我无法确定正确的语法。
理想情况下,这会起作用,但似乎不起作用:
it('throws an error', async () => {
let r = await wins();
r.should.equal('Winner');
(await fails()).should.throw(Error);
});
原文由 plexer 发布,翻译遵循 CC BY-SA 4.0 许可协议
这种方法的问题是
(await fails()).should.throw(Error)
没有意义。await
解析为Promise
。如果Promise
拒绝,它会抛出被拒绝的值。所以
(await fails()).should.throw(Error)
永远无法工作:如果fails()
拒绝,则会抛出错误,并且.should.throw(Error)
永远不会执行。您拥有的最惯用的选择是使用 Chai 的
rejectedWith
属性,如您在问题中所示。这是一个简单的例子。与您在问题中展示的内容没有太大区别; I’m just using
async
functions forwins()
andfails()
andexpect
instead ofshould
.当然,您可以使用返回Promise
和chai.should
的函数就好了。如果你喜欢你的
wins()
测试类似于你的fails()
测试更仔细,你可以写你的wins()
测试像这样:在这两个示例中,要记住的关键是
chai-as-promised
为其函数返回承诺,例如rejectedWith
和eventually.something
。因此,您必须await
它们在async
测试函数的上下文中,否则失败的条件仍然会通过:如果您使用上面的代码运行测试,您将得到以下结果:
如您所见,chai 断言实际上失败了,但它们在 Promise 的上下文中失败了,该 Promise 从未有人
await
编辑或catch
编辑。所以 Mocha 看不到失败并将测试标记为通过,但是 Node.js(如上所述,在未来会改变的行为中)将未处理的拒绝打印到终端。