来自本机代码的 mocha 测试中未处理的拒绝

Posted

技术标签:

【中文标题】来自本机代码的 mocha 测试中未处理的拒绝【英文标题】:Unhandled rejections in mocha tests from native code 【发布时间】:2019-03-14 02:37:43 【问题描述】:

我在 mocha 测试中收到“未处理的拒绝”消息,但我不知道问题的确切根源是什么,因为这是异步发生的。

我知道我可以为全局 unhandledRejection 事件添加一个事件监听器,例如:

process.on('unhandledRejection', function(reason)  
     console.error(reason);
     process.exit(1);
);

但这并没有真正的帮助,因为跟踪如下:

 Error: ENOENT: no such file or directory, open '/tmp/testfile.json'
    at Error (native)
  cause: 
    Error: ENOENT: no such file or directory, open '/tmp/testfile.json'
       at Error (native)
     errno: -2,
     code: 'ENOENT',
     syscall: 'open',
     path: '/tmp/testfile.json' ,
  isOperational: true,
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/tmp/testfile.json' 

问题与节点的内置处理程序相同。没有回溯。

显然我没有得到正确的回溯,因为拒绝发生在本机 fs 模块中。 如果我尝试只运行发生此跟踪的测试,它根本不会发生。这可能是因为“早些时候”在某个地方设立了一个失控的承诺。指定的 /tmp/ 路径不存在于测试代码或实际实现代码中的任何位置。 testfile.json 确实存在,但不在该路径中。

我正在使用节点 6.5.0 运行 mocha 3.5.3。

那么问题来了:如何缩小范围以找到有问题的代码?

【问题讨论】:

指定的/tmp/路径在测试代码或实际实现代码中都不存在 - testfile.json呢? 那个确实存在。更新问题。 检查它在代码库中的使用位置并从那里继续。不知道/tmp/ 可以从哪里得到,这可能并不重要。重要的是为什么使用了错误的路径。可能是因为您错误地依赖 CWD。​​span> 【参考方案1】:

我不确定它是否会有所帮助,但您也可以从unhandledRejection 侦听器获取Promise 作为参数,以获取更多有用的输出。文档here

process.on('unhandledRejection', (reason, p) => 
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
);

【讨论】:

在这种情况下,它没有多大帮助。基本上我得到了更详细的跟踪,但仍然没有堆栈跟踪。我仍然对此表示赞同,因为它可能对其他人有帮助。【参考方案2】:

一种通用方法。将问题一分为二:

    将一些测试套件文件移动到单独的目录,以便在测试期间不会执行它们 重新运行摩卡 观察失败消息是否仍然存在 如果是,请继续移动更多文件。如果不是,则有问题的文件是最后移动的文件之一。

然后继续平分导致问题的特定文件。注释掉代码,直到有问题的代码没有被执行。

【讨论】:

这实际上帮助我查明了问题所在。问题是一些 EventEmitter 侦听器处理程序没有为单元测试存根。这导致了错误消息。在后来的测试套件中,实际的实现监听器代码作为副作用运行。这段代码当然使用了部分未初始化的变量。 我接受我自己的答案,直到有人想出更好的方法。

以上是关于来自本机代码的 mocha 测试中未处理的拒绝的主要内容,如果未能解决你的问题,请参考以下文章

未处理的拒绝(TypeError):无法读取反应中未定义的属性“setState”(firestore)

Puppeteer -Getting UnhandledPromiseRejectionWarning:管道中未处理的承诺拒绝

处理快递申请中未处理的承诺拒绝

如何解决等待消息中未处理的 Promise 拒绝?

Chai + mocha,解决则测试成功,拒绝则失败

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