刚刚开始使用jest测试一些节点应用程序。express-generator
用于搭建。
在第一次测试中,我得到以下错误:
Jest检测到以下3个打开的句柄可能会阻止Jest退出
复制步骤:
git clone git@github.com:gandra/node-jest-err-demo.git
cd node-jest-err-demo
npm install
cp .env.example .env
npm run test
npx envinfo --preset jest
输出:
npx: installed 1 in 1.896s
System:
OS: macOS High Sierra 10.13.4
CPU: x64 Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz Binaries:
Node: 9.3.0 - /usr/local/bin/node
Yarn: 1.5.1 - /usr/local/bin/yarn
npm: 5.7.1 - /usr/local/bin/npm npmPackages:
jest: ^23.1.0 => 23.1.0
知道怎么修吗
以下是github上的相关问题:https://github.com/facebook/jest/issues/6446
4条答案
按热度按时间khbbv19g1#
detectOpenHandles
选项用于检测打开的句柄,应该正常使用。错误警告 * 潜在 * 打开的句柄:Jest检测到以下4个打开的句柄可能会阻止Jest退出
即使手柄关闭,错误仍然会出现。
此应用程序的实际问题是数据库连接没有真正关闭:
由于某种原因,
NODE_ENV
是dev
,尽管文档中指出它应该是test
。在应用程序启动时立即关闭数据库连接可能会导致实际使用数据库连接的单元出现问题。如指南中所述,MongoDB连接应在测试结束时进行。由于使用默认Mongoose连接,因此它可以是:
ykejflvf2#
我是这样解决这个问题的。
然后在给出问题的特定测试中设置jest.setTimeout。
按照上面的回答,关闭任何其他打开的手柄。
vawmfj5a3#
我在Mongoose中遇到了同样的问题,但在我的情况下,在
afterAll
中调用disconnect
并没有做出改变。但是在beforeAll
中添加基于promise的setTimeout
确实有效。但是我不是定时器的粉丝,并设法像这样修复了它。👇以上的变通方法对我来说感觉更自然,希望对你有帮助。
qhhrdooz4#
2023年4月更新-新增
openHandlesTimeout
选项jest 29.5.0添加了一个新的
openHandlesTimeout
选项openHandlesTimeout [number]默认值:1000
如果Jest在完成后的毫秒数内没有干净地退出,则打印一个警告,指出可能存在打开的句柄。使用0禁用警告。
await sleep(3 * SECONDS)
或类似的句柄来关闭,你现在可以在配置中设置openHandlesTimeout
来避免这些黑客攻击。openHandlesTimeout
设置为0
。在我自己的案例中,我有:
添加:
到我的
jest.config.js
使问题消失(
SECONDS
是1000
的常数,以避免幻数)。