【问题标题】: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 处理程序,但测试仍然通过)

【问题讨论】:

  • @MihaiAndrici,我没有提到它以保持问题和代码简短,但在原始代码中它实际上不是throw,而是一个失败的 Chai 断言。结果是一样的(expect.fail() 不会导致测试失败)。不过还是谢谢。

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


【解决方案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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多