使用内部异步函数的异步测试应该失败

Async test with inner async function should fail

在我的 mocha.js 测试中,我调用了一个抛出错误的 async 函数,但测试没有失败。它通过了,并且有一个 UnhandledPromiseRejectionWarning:

describe('async function', async function () {
    it('should fail', async function () {
        [1].forEach(async function () {
            throw new Error("Why can't I see this error?!");
        });
    });
});

请注意,一个更简单的案例按预期工作:

describe('async function', async function () {
    it('should fail', async function () {
        throw new Error('This one fails the test');
    });
});

如何导致测试因内部函数异常而失败?

(我已经尝试添加一个 unhandledRejection 处理程序,但测试仍然通过)

您的 .forEach 测试用例无法像您希望的那样工作。当它调用它的异步回调时,回调确实创建了一个承诺,但是 .forEach 没有对它做任何事情。您传递给 it 的回调也是异步的,它执行 return 一个承诺,但是 returns 的承诺与 .forEach 的回调产生的承诺无关.这就是为什么你得到 UnhandledPromiseRejectionWarning.

您可以通过 Promise.all:

连接 promise 来解决问题
describe('async function', async function () {
    it('should fail', async function () {
        return Promise.all([1].map(async function () {
            throw new Error("Why can't I see this error?!");
        }));
    });
});

使用map使你的数组​​变成一个promises数组,然后Promise.all等待数组中的所有promises被解决,或者如果有任何promise则拒绝拒绝。返回 Promise.all 调用的 return 值,然后让 Mocha 等待整个过程。

Louis 的回答很正确。作为替代方案,您可以避免使用内部函数,而是使用普通的 for 循环:

const data = [1];
for (let i = 0; i < data.length; i++) {
  // await some more stuff here
  throw new Error('This one fails the test');
}