设置
我有一个使用NodeJS的项目,使用以下内容:
在加载模型模块时实例化Sequelize,该模块由几个使用Jest进行测试的文件导入。
问题
Jest测试通过,但却停留在以下消息中:
Jest did not exit one second after the test run has completed.
This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with
--detectOpenHandles
to troubleshoot this issue.
注意:将--detectOpenHandles
添加到测试调用中不会影响输出结果。
实际上没有从任何测试路径调用sequelize
对象,但是一些经过测试的文件导入models
模块,因此Sequelize被实例化。
(我还要指出,这仅发生在我的TravisCI环境中,但我怀疑这是一个虚假情况。)
上下文
由于Jest在并行运行测试,因此整个测试过程中会多次加载models
模块。我通过debug输出验证了这一点,当我运行测试时,出现了多个SEQUELIZE LOADED
。
尝试
我确实尝试在
globalTeardown
中调用sequelize.close()
,但这似乎只是打开(然后关闭)新的sequelize连接。由于没有任何测试实际上依赖数据库连接,因此我尝试在导出之前立即在
models
模块内运行sequelize.close()
。这解决了问题(但显然不是解决方案)。我尝试配置测试连接池以主动结束连接。
const sequelizeConfig = {
...
pool: {
idle: 0,
evict: 0,
}
}
这没有任何作用。
要求
我不想使用蛮力解决方案,例如通过Jest运行
--forceExit
来运行我的测试。这感觉像是忽略了根本问题,并可能在以后暴露给其他种类的错误。我的测试分散在几十个文件中,这意味着需要在
afterAllTests
中调用某些内容将需要大量冗余并引入代码气味。
问题
如何确保sequelize连接在测试完成后关闭,以免导致Jest挂起?