我想检查异步函数是否使用本机assert.throws模块中的assert抛出。我试过
const test = async () => await aPromise();
assert.throws(test); // AssertionError: Missing expected exception..(很明显?)无法工作,因为函数在承诺被解析之前就退出了。然而,我发现在这个问题中,使用回调实现了同样的目标。
有什么建议吗?
(我正在使用Babel转到Node.js本地生成器。)
发布于 2019-03-22 09:41:52
由于这个问题仍然受到关注,我想总结两个最好的解决方案,特别是突出新的标准方法。
节点v10+
断言库中有一个专用的方法,assert.rejects。
对于较早版本的Node
来自vitalets回答的填充
import assert from 'assert';
async function assertThrowsAsync(fn, regExp) {
let f = () => {};
try {
await fn();
} catch(e) {
f = () => {throw e};
} finally {
assert.throws(f, regExp);
}
}发布于 2017-10-26 14:50:35
基于Bergi回答,我提出了更通用的解决方案,使用原始assert.throws来处理错误消息:
import assert from 'assert';
async function assertThrowsAsync(fn, regExp) {
let f = () => {};
try {
await fn();
} catch(e) {
f = () => {throw e};
} finally {
assert.throws(f, regExp);
}
}用法:
it('should throw', async function () {
await assertThrowsAsync(async () => await asyncTask(), /Error/);
});发布于 2018-02-01 22:11:45
答案给了我工作,但我今天遇到了这个问题,并想出了另一个解决方案,我认为这是比较简单的。
// Code being tested
async function thisFunctionThrows() {
throw new Error('Bad response')
}
// In your test.
try {
await thisFunctionThrows()
assert.equal(1 == 0) // Never gets run. But if it does you know it didn't throw.
} catch (e) {
assert(e.message.includes('Bad response'))
}https://stackoverflow.com/questions/35782435
复制相似问题