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

Posted

技术标签:

【中文标题】内部异步函数的异步测试应该失败【英文标题】:Async test with inner async function should fail 【发布时间】:2018-04-06 20:26:42 【问题描述】:

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

【问题讨论】:

在这里查看主题:***.com/questions/14879181/… @MihaiAndrici,我没有提到它以保持问题和代码简短,但在原始代码中它实际上不是throw,而是一个失败的 Chai 断言。结果是一样的(expect.fail() 不会导致测试失败)。不过还是谢谢。 【参考方案1】:

.forEach 的测试用例无法像您希望的那样工作。当它调用它的异步回调时,回调确实会创建一个 Promise,但 .forEach 不会对它做任何事情。您传递给it 的回调也是异步的,它确实返回了一个promise,但它返回的promise 与.forEach 的回调产生的promise 没有关联。这就是你得到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 可以使您的数组变成一个promise 数组,然后Promise.all 等待数组中的所有promise 被解析,或者如果任何promise 被拒绝,它就会拒绝。返回 Promise.all 调用的返回值,然后让 Mocha 等待整个过程。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于内部异步函数的异步测试应该失败的主要内容,如果未能解决你的问题,请参考以下文章

开玩笑 - 断言异步函数抛出测试失败

Mocha,应该 - 在测试具有承诺的异步函数时,断言错误是沉默的

测试总结--同步或异步处理过程中常见的问题

Spring异步方法集成测试失败

异步函数的行为不像我对 Jest 的预期那样

在异步超时时传递Jasmine规范