摩卡测试抱怨未处理的承诺,但使用异步/等待与catch块

时间:2018-06-21 17:20:38

标签: javascript async-await mocha

这些天我经常使用async / await,但是我进行了一项mocha测试,在其中进行测试以确保确实抛出了错误。在下面,您可以看到try / catch块,我必须捕获此错误。绿色和灰色方块是由Wallaby(一种实时测试工具)插入的,表示从未到达捕获块。

enter image description here

当我从命令行运行mocha时,会收到以下消息:

  

UnhandledPromiseRejectionWarning:FireModel :: WrongRelationshipType:无法在带有fancyperson的addToRelationship()上使用属性“ employer”,因为它不是hasMany关系[relType:ownedBy,inverse:undefined]。如果您使用的是ownedBy关系,则应改用setRelationship()和clearRelationship()。

addToRelationship()的第一行检查关系类型是否正确(不是)并抛出错误:

enter image description here

_errorIfNotHasManyReln方法并不令人兴奋,但是为了完整起见,这里是:

protected _errorIfNotHasManyReln(
  property: Extract<keyof T, string>,
  fn: string
) {
  if (this.META.property(property).relType !== "hasMany") {
    const e = new Error(
      `Can not use property "${property}" on ${
        this.modelName
      } with ${fn}() because it is not a hasMany relationship [ relType: ${
        this.META.property(property).relType
      }, inverse: ${
        this.META.property(property).inverse
      } ]. If you are working with a ownedBy relationship then you should instead use setRelationship() and clearRelationship().`
    );
    e.name = "FireModel::WrongRelationshipType";
    throw e;
  }

有人可以帮助我确定为什么未捕获此错误的原因吗?无奈之下,我在调用_errorIfNotHasManyreln的调用周围添加了另一个try / catch块,它确实捕获了错误,但是随后我尝试重新抛出它并再次遇到相同的情况。

1 个答案:

答案 0 :(得分:2)

您的addToRelationship方法也是异步的。您还必须await做出承诺响应:

try {
    await bob.addToRelationship("employer", "4567");
}
catch(e) {
    [...]
}

如果没有延迟到承诺拒绝,那么try / catch不会收到任何已同步并终止的内容。然后发生异常,显然没有捕获到该异常。