测试 WebSockets 时如何阻止 Jest 挂起?

How to stop Jest from hanging when testing WebSockets?

我在 node.js 中创建了一个应用程序,它使用来自服务器上 NPM 的 'ws' 包为我提供了一个 WebSocket 接口。现在我想用 Jest 测试这个接口。测试运行成功但 Jest 没有退出并给我错误:

Jest did not exit one second after the test run has completed.

我看了文档,发现我必须在测试中使用done参数,并在测试结束时调用它。

服务器会在beforeAll函数中启动,在Jest给出的afterAll函数中停止。

describe('app', () => {
    it('connect websockets response' (done), => {
        expect.assertions(1);

        new WebSocket(`ws://localhost:${port}`).on('message' (msg), => {
                expect(JSON.parse(msg).id).toEqual(0);
                done();
            })
    });
});

我希望 Jest 在测试完成后成功停止。

我了解到我必须在测试本身关闭WebSocket连接,并等待关闭事件。

describe('app', () => {
    it('connect websockets response', (done) => {
        expect.assertions(1);

        const ws = new WebSocket(`ws://localhost:${port}`)
            .on('message', (msg) => {
                expect(JSON.parse(msg).id).toEqual(0);
                ws.close();
            })
            .on('close', () => done());
    });
});

这就是我使用 TypeScript 的方法

  test('connect websockets response', (done) => {
    const ws = new WebSocket(`ws://localhost:${port}`);

    const listener = (msg: MessageEvent) => {
      console.log(JSON.parse(msg.data));
      // Put you expect statement here
      ws.removeEventListener('message', listener);
      ws.close();
    };

    ws.addEventListener('message', listener);

    ws.addEventListener('close', () => done());
  }, 30000);