我试着按照 文件 以便使用assert.rejects测试错误信息(我确实有高于v10的Node)。
但它总是通过,即使是一个可笑的消息。我到底做错了什么?
it("should fail but it's not",
async ()=> {
let itemId = 'not an id'
assert.rejects(
await ListRepo.checkById(itemId),
{message: 'abracadabra'}
)
}
)
UPDATE:似乎如果我返回assert.rejects,它就会工作。但我还是不知道原因。
nicholaswmin说的是正确的,但这里有一个 "猫头鹰的休息 "的时刻,我想澄清一下。
如果你的愿望是 "我想断言拒绝" 即 "我想确保这段代码以正确的方式拒绝",这个模式有点复杂。
首先,写进 return fxnWhichReturnsPromise()
. 如果你的函数是拒绝的,那么测试就会失败,而你要的是反过来的。你必须使用两个参数的签名,即 .then()
,它看起来像。.then(onFulfillCallback, onRejectCallback)
,因为如果你把它分成 .then
& .catch
,未能在 .then
-块将被后续的 .catch
-块,本应是失败的测试(它没有拒绝)将成为合格的测试。
在实践中,总共看起来是这样的。
it('rejects when given foobar', () => {
return fxnThatShouldReject(foobar)
.then(
(val) => { assert.fail(`Should have rejected, returned with ${val} instead`)
,
(err) => { assert.equal(err.message, "Rejection reason I was expecting") }
)
})
断言库没有内置的断言处理程序的原因是,能够在测试套件中 "暂停 "异步执行,其实是测试运行器的一种能力。assert.throws()
相比之下,是同步的。