Javascript Mocha测试抱怨未处理的承诺,但使用了带有catch块的异步/等待

Javascript Mocha测试抱怨未处理的承诺,但使用了带有catch块的异步/等待,javascript,async-await,mocha.js,Javascript,Async Await,Mocha.js,最近我经常使用async/Wait,但我有一个mocha测试,我在其中测试以确保确实抛出错误。下面您可以看到我必须捕获此错误的try/catch块。绿色和灰色的方块由Wallaby(一种实时测试工具)插入,表示从未到达捕捉块 当我从命令行运行mocha时,我得到以下消息: 未处理的PromisejectionWarning:FireModel::ErrorRelationshipType:无法在具有addToRelationship()的fancyperson上使用属性“employer”,因

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

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

未处理的PromisejectionWarning:FireModel::ErrorRelationshipType:无法在具有addToRelationship()的fancyperson上使用属性“employer”,因为它不是hasMany关系[relType:ownedBy,Reverse:undefined]。如果您使用的是ownedBy关系,则应改为使用setRelationship()和clearRelationship()

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

\u 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;
  }
protected\u errorIfNotHasManyReln(
财产:摘录,
fn:字符串
) {
if(this.META.property(property.relType!=“hasMany”){
常数e=新错误(
`无法在上使用属性“${property}”${
这个是.modelName
}因为它不是hasMany关系[relType:${
this.META.property(property).relType
},逆:${
this.META.property(property).inverse
}]如果您使用的是ownedBy关系,则应改为使用setRelationship()和clearRelationship()`
);
e、 name=“FireModel::ErrorRelationshipType”;
投掷e;
}

有人能帮我找出这个错误没有被捕获的原因吗?在绝望中,我在调用
\u errorifnotasmanyren
的过程中添加了另一个try/catch块,它确实捕获了错误,但是我尝试并重新抛出它,结果再次出现相同的情况。

您的addToRelationship方法也是异步的。您必须
等待承诺回复:

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

如果没有延迟,直到承诺被拒绝,那么try/catch没有收到任何同步和终止的内容。然后,出现了明显未被捕获的异常。

您没有等待承诺解决方案,因此它将继续超出您的捕获块,并最终未被处理。噢!就是这样。一旦您确信自己的工作ld疯了,你看不见东西了。谢谢你为我把理智带回到世界上来。:)