`npm test`永不退出

时间:2017-12-28 23:56:23

标签: node.js unit-testing npm mocha

我使用mocha来运行单元测试,并经常使用npm test来运行它。我的package.json包含以下脚本定义:

"pretest": "NODE_ENV=test node migrate all",
"test": "DEBUG= NODE_ENV=test mocha --recursive",

如果我直接在我的shell中运行这些命令中的任何一个(即不通过npm)它们执行正常(790个测试需要大约2米才能运行,迁移脚本在1秒内完成)。这些过程也会干净利落地退出。

但是,如果我通过npm test运行这些,则所有内容都以完全相同的方式运行,但进程不会退出(我必须使用^c手动取消它。)

我无法确定如何准确调试此处发生的事情,以便弄清楚该流程为何不会退出。

值得注意的是,如果我测试一个子目录(npm test ./test/queue),该子目录不会与数据库进行的交互,那么该过程退出正常。但是,这些测试会与AMQP代理进行交互,因此在套接字上会有一些活动。这告诉我数据库连接导致了问题。我正在使用knex连接到postgres9.6服务器。这也表明pretest脚本不是问题。如果我尝试运行一组与数据库交互的测试,那么进程永远不会退出(因此可能是开放套接字阻止它这样做,但为什么这只应该发生在npm test而非直接执行超出我的范围。

额外信息:

  • 节点版本:8.7.0
  • mocha版本:4.0.1
  • npm version:5.6.0
  • knex版本:0.14.0
  • 我在我的代码库中使用async / await

1 个答案:

答案 0 :(得分:8)

我错误地认为这是一个npm问题。相反,当我在我的shell中运行mocha时,它使用的是全局安装的mocha,它与本地安装的版本不同。使用此版本运行会导致同样的问题。

此行为更改似乎来自this issuechangelog中对此进行了描述:

  

默认情况下,一旦所有测试完成,Mocha将不再强制进程退出。这意味着在Mocha中运行时,通常会阻止节点退出的任何测试代码(或测试中的代码)都会这样做。提供--exit标志以恢复到v4.0.0之前的行为(@ScottFreeCode,@ boneskull)