内部异步函数的异步测试失败

时间:2017-10-25 16:30:48

标签: javascript node.js async-await mocha ecmascript-2017

在我的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处理程序,但测试仍然通过)

2 个答案:

答案 0 :(得分:3)

.forEach的测试用例无法像您希望的那样工作。当它调用异步回调时,回调会创建一个承诺,但.forEach不会对它做任何事情。您传递给it的回调也是异步的,它确实返回一个承诺,但它返回的承诺与.forEach回调产生的承诺没有关联。这就是你获得UnhandledPromiseRejectionWarning的原因。

您可以通过Promise.all

连接承诺来解决问题
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调用的返回值,然后允许Mocha等待整个事情。

答案 1 :(得分:3)

路易斯的回答是现实的。作为替代方案,您可以避免使用内部函数并改为使用普通的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');
}