Mocha等待/异步处理(预期)错误

时间:2018-08-17 15:49:05

标签: javascript error-handling async-await mocha

前段时间,我很好奇如何使用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块,那么它也不起作用。

谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我找到了一种方法,但是您需要升级到节点版本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);