【问题标题】:Mocha await/async handling (expected) errorsMocha 等待/异步处理(预期)错误
【发布时间】:2018-08-17 15:49:05
【问题描述】:

前段时间,我很好奇如何使用 Mocha 执行异步测试以及这些测试会导致错误(请参阅 Mocha async test handle errors

现在我使用 await/async 对新版本的 nodejs 进行了同样的尝试。只是一个简单的案例,但由于我需要将代码包装在 try / catch 块中,所以事情会失控。

经过长时间的测试,我最终找到了一个解决方案,但看起来不太好。

所以我正在寻找一种更好的方法来做到这一点。

测试看起来像这样:

it('myTest', async function () {

  // THIS WORKS => CODE OPTION 1:
  // this works, it uses promises but not await/async
  return somePromiseFunction()
    .then(() => Promise.reject(new Error('Expected method to reject.')))
    .catch(err => assert.ok(err instanceof Error, 'This should be an error!'));


  // THIS WORKS => CODE OPTION 2:
  // this works, it uses await/async
  let forceFail = false;
  try {
    await somePromiseFunction();
    forceFail = true;
  } catch (err) {}
  if (forceFail) assert.ok(false, 'Expected method to reject.');


  // WONT WORK => CODE OPTION 3:
  try {
    await somePromiseFunction();
    assert.ok(false, 'you shouln\'t be here');
  } catch (err) {
    assert.ok(err instanceof Error, 'This should be an error!');
  }

});

选项 1 和 2 都有效。选项 1 使用经典的 Promise.then.catch 语法,没关系。选项 2 是我使事情正常进行的唯一方法,但理解/维护非常复杂。它依赖于一种全局变量和处理状态,而且看起来不太好。

代码中有一个选项3,但它不起作用。这样的东西很容易阅读,但它根本不起作用,不是第一个断言也不是第二个。

如果您删除 try / catch 块,那么它也将不起作用。

谢谢。

【问题讨论】:

    标签: javascript error-handling async-await mocha.js


    【解决方案1】:

    在第三个选项中,err 将始终为undefined,因为您将异常捕获为e,而不是err。并且断言总是会失败,因为undefined 不是Error 的实例。

    【讨论】:

    • 那只是一个错字。真正的问题是他们的 async/await 编码风格使用 try/catch,当抛出错误或断言时,它将由 catch 处理,因此对于 mocha 来说这不会是一个真正的错误。
    【解决方案2】:

    我找到了一种方法,但您需要升级到 node 版本 10。我使用的是 8,但 assert 中包含的这个新功能以一种优雅的方式解决了我的问题。

    不要尝试这个:

    // WONT WORK => CODE OPTION 3:
    try {
      await somePromiseFunction();
      assert.ok(false, 'you shouln\'t be here');
    } catch (err) {
      assert.ok(err instanceof Error, 'This should be an error!');
    }
    

    这样做:

    // this works!
    await assert.rejects(
      async () => somePromiseFunction(),
      Error
    );
    

    您还可以验证抛出的错误类型,但在我的情况下,Error 就足够了。

    编辑:async () => 并不是真的需要,我最终得到了一个断言(第二个参数是可选的,但我宁愿保留它):

    await assert.rejects(somePromiseFunction(), Error);
    

    【讨论】:

      猜你喜欢
      • 2018-07-29
      • 2022-01-09
      • 2018-04-06
      • 2017-05-25
      • 1970-01-01
      • 2015-10-23
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多