Jest 没有在所有的测试完成之后结束并退出

问题再现

运行 jest

npx jest -- test/abc.spec.js
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.

原因分析

所有的 cases 中某些 test 是异步加了 async 的,但是这些被测试的方法调用了另外的服务,其中一个主要的服务是 redis。是不是与 redis 服务的连接没有被断开在所有的测试完成以后,导致 jest 的进程 hang 住了?

尝试解决

Jest 应当有清除方法,在所有的测试完成以后执行。利用 Jest.afterAll()

  afterAll(() => {
    console.log('所有的测试已经完成.');
    // 防止报错:Jest did not exit
    client.end(true);
  });

上面的 client.end 是 redis 断开链接的方法,client 是 redis nodejs 的 client 对象。

验证

再次运行上面的 Jest, 发现前述的警报信息消失了,证明 client.end(true) 对本次 Jest 运行有影响。

补充

如果是 mysql 未断开连接,那么可以采用 await pool.end() 来结束断开连接。

关于本文如您有任何想法和意见,欢迎与我们联系,邮箱地址zhi@uqugu.com
您对本文有什么看法,喜欢或者不喜欢都可以发表意见。