如何在 Mocha 测试中调试“错误:无理由或错误理由拒绝承诺”?

Posted

技术标签:

【中文标题】如何在 Mocha 测试中调试“错误:无理由或错误理由拒绝承诺”?【英文标题】:How to debug "Error: Promise rejected with no or falsy reason" in Mocha tests? 【发布时间】:2015-12-30 05:42:12 【问题描述】:

我在 Mocha 中的测试失败并出现此错误。

我已将 catch 语句放在每个 Promise 链的末尾,这些语句会抛出任何错误,但它们不会被调用。

但测试仍然失败并出现以下错误:

Error: Promise rejected with no or falsy reason
  at tryCatcher (node_modules/bluebird/js/main/util.js:26:23)
  at Promise._settlePromiseFromHandler (node_modules/bluebird/js/main/promise.js:507:31)
  at Promise._settlePromiseAt (node_modules/bluebird/js/main/promise.js:581:18)
  at Promise._settlePromises (node_modules/bluebird/js/main/promise.js:697:14)
  at Async._drainQueue (node_modules/bluebird/js/main/async.js:123:16)
  at Async._drainQueues (node_modules/bluebird/js/main/async.js:133:10)
  at Immediate.Async.drainQueues [as _onImmediate] (node_modules/bluebird/js/main/async.js:15:14)

我如何找出问题到底是什么,哪个承诺被拒绝并获得更有意义的跟踪?

【问题讨论】:

包含您的测试代码会有所帮助。 【参考方案1】:

我找到了触发错误的原因。我不得不承诺一个流,所以我把它包装在 return new Promise...

但是,promise 与常规回调有不同的签名。回调中首先出现错误:function(err, res) ... 。在 Promise 中,情况正好相反:new Promise(function(resolve, reject) ...

我有new Promise(function(reject, resolve) ... 。因此,我在流完成时调用resolve,在流出现错误时调用reject。但是,我的 resolve 实际上是 reject 函数,而我的 reject 实际上是 resolve 函数,因为我将它们反转了。

【讨论】:

谢谢,这是我的问题。在 Promise 签名中首先解析,然后拒绝 也许你可以在这里使用 bluebirds PromisifyPromisifyAll 函数,它们会将回调转换为 Promise - 请参阅:bluebirdjs.com/docs/api/promise.promisify.html

以上是关于如何在 Mocha 测试中调试“错误:无理由或错误理由拒绝承诺”?的主要内容,如果未能解决你的问题,请参考以下文章

VSCode下调试mocha测试用例

调试 mocha 测试的阻力最小的途径是啥?

带有 mocha 的节点检查器无法使用“调试器”命令

用于 TypeScript Mocha 测试的 Vscode 断点

测试框架Mocha与断言expect

如何在 mocha 单元测试中使用猫鼬?