我使用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
而非直接执行超出我的范围。
额外信息:
async
/ await
答案 0 :(得分:8)
我错误地认为这是一个npm
问题。相反,当我在我的shell中运行mocha
时,它使用的是全局安装的mocha
,它与本地安装的版本不同。使用此版本运行会导致同样的问题。
此行为更改似乎来自this issue,changelog中对此进行了描述:
默认情况下,一旦所有测试完成,Mocha将不再强制进程退出。这意味着在Mocha中运行时,通常会阻止节点退出的任何测试代码(或测试中的代码)都会这样做。提供--exit标志以恢复到v4.0.0之前的行为(@ScottFreeCode,@ boneskull)