gpt4 book ai didi

node.js - 使用 Mocha/Chai 和 async/await 验证是否引发了异常

转载 作者:IT老高 更新时间:2023-10-28 23:01:20 27 4
gpt4 key购买 nike

我正在努力寻找在使用 async/await 时验证 promise 在 Mocha 测试中被拒绝的最佳方法。

这是一个可行的示例,但我不喜欢 should.be.rejectedWith 返回一个需要从测试函数返回才能正确评估的 promise 。使用 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);
});

最佳答案

这种方法的问题在于 (await failed()).should.throw(Error) 没有意义。

await 解析 Promise。如果 Promise 被拒绝,它会抛出被拒绝的值。

所以 (await failed()).should.throw(Error) 永远无法工作:如果 fails() 拒绝,则抛出错误,并且 .should.throw(Error) 永远不会被执行。

您拥有的最惯用的选项是使用 Chai 的 rejectedWith 属性,正如您在问题中所显示的那样。

这是一个简单的例子。与您在问题中展示的内容没有什么不同;我只是对 wins()fails()expect 使用 async 函数而不是 应该。当然,您可以使用返回 Promisechai.should 的函数。

const chai = require('chai')
const expect = chai.expect
chai.use(require('chai-as-promised'))

// Always succeeds
async function wins() {
return 'Winner'
}

// Always fails with an error
async function fails() {
throw new Error('Contrived Error')
}

it('wins() returns Winner', async () => {
expect(await wins()).to.equal('Winner')
})

it('fails() throws Error', async () => {
await expect(fails()).to.be.rejectedWith(Error)
})

如果您希望您的 wins() 测试更类似于您的 fails() 测试,您可以编写您的 wins()像这样测试:

it('wins() returns Winner', async () => {
await expect(wins()).to.eventually.equal('Winner')
})

在这两个示例中要记住的关键是 chai-as-promised 为其函数返回 promise ,例如 rejectedWitheventually.something。因此,您必须在 async 测试函数的上下文中 await 它们,否则失败的条件仍然会通过:

async function wins() {
return 'Loser'
}

async function fails() {
return 'Winner'
}

it('wins() returns Winner', async () => {
expect(wins()).to.eventually.equal('Winner')
})

it('fails() throws Error', async () => {
expect(fails()).to.be.rejectedWith(Error)
})

如果您使用上面的代码运行测试,您会得到以下结果:

$ npm test

> mocha-chai-async@1.0.0 test /home/adaline/code/mocha-chai-async
> mocha .



√ wins() returns Winner
(node:13836) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rej
ection id: 1): AssertionError: expected 'Loser' to equal 'Winner'
(node:13836) [DEP0018] DeprecationWarning: Unhandled promise rejections are dep
recated. In the future, promise rejections that are not handled will terminate
the Node.js process with a non-zero exit code.
√ fails() throws Error
(node:13836) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rej
ection id: 2): AssertionError: expected promise to be rejected with 'Error' but
it was fulfilled with 'Winner'

2 passing (11ms)

如您所见,chai 断言实际上失败了,但它们在没有人 awaited 或 catched 的 Promise 上下文中失败了。所以 Mocha 没有看到失败,并将测试标记为通过,但是 Node.js(行为会在未来发生变化,如上所述)将未处理的拒绝打印到终端。

关于node.js - 使用 Mocha/Chai 和 async/await 验证是否引发了异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45466040/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com