为什么Jest无法正常退出?UDP套接字未关闭引发句柄残留问题
问题原因与解决方法
原因
- 你在
describe块的顶层直接创建了UDP套接字,这个操作会在测试套件初始化阶段就执行,套接字被创建后一直处于打开状态。 - Node.js的UDP套接字底层对应
UDPWRAP句柄,属于异步资源,只要它未被关闭,Node.js的事件循环就不会终止。Jest会监听事件循环状态,检测到未关闭的句柄时就会抛出这个警告。 - 你的测试用例并没有使用这个套接字,但它已经被实例化并保持打开,所以测试通过后句柄依然存在,阻止Jest正常退出。
解决办法
方法一:用钩子管理套接字生命周期
在beforeAll中创建套接字,在afterAll中关闭它,确保测试结束后释放资源:
const dgram = require('node:dgram'); describe("udp client", () => { let testClient; beforeAll(() => { testClient = dgram.createSocket('udp6'); }); afterAll((done) => { // 关闭套接字并通过done告知Jest异步操作完成 testClient.close(done); }); test('test', () => { let popo = false; expect(popo).toEqual(false); }); });
方法二:测试内部创建并即时关闭
如果测试不需要提前准备套接字,就在单个测试用例内部创建,用完后立即关闭:
const dgram = require('node:dgram'); describe("udp client", () => { test('test', (done) => { const testClient = dgram.createSocket('udp6'); // 执行你的UDP相关测试逻辑 let popo = false; expect(popo).toEqual(false); // 测试完成后关闭套接字 testClient.close(done); }); });
内容的提问来源于stack exchange,提问作者Hector Socarras
相关产品推荐
相关产品推荐

