You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Socket.io连接逻辑的Jest单元测试覆盖问题

Socket.io连接逻辑Jest测试覆盖问题解决

问题背景

我已经在Node.js中完成Socket.io的安装与连接,事件收发功能正常,核心代码如下:

const io = require('socket.io')(server, {
  cors: {
      origin: "http://localhost:4200",
      methods: ["GET", "POST"]
  }
});
io.on('connection', (socket)=>{
  console.log('Client connected');
  io.emit('message', items);
  socket.on('message', data => {
      console.log('this is server data', data);
      items.push(data);
      io.emit('message', items);
  })
})

目前前后端运行无异常,但使用Jest编写单元测试时,始终无法覆盖上述Socket.io的连接逻辑。参考官方Jest测试示例后,测试无报错,但连接代码完全未被统计到覆盖率中。

解决步骤

1. 用客户端连接触发服务端connection事件

要覆盖connection回调里的逻辑,必须在测试中实际创建客户端连接,触发服务端的连接事件。可以借助socket.io-client实现:

示例测试代码:

const io = require('socket.io');
const ioClient = require('socket.io-client');
const http = require('http');

describe('Socket.io connection logic', () => {
  let server;
  let socketServer;
  let clientSocket;
  // 全局定义items,和服务端保持一致
  let items = [];

  beforeAll((done) => {
    server = http.createServer();
    socketServer = io(server, {
      cors: { origin: "http://localhost:4200", methods: ["GET", "POST"] }
    });
    // 引入服务端的Socket逻辑(或直接引入你的服务文件)
    socketServer.on('connection', (socket)=>{
      console.log('Client connected');
      socketServer.emit('message', items);
      socket.on('message', data => {
        console.log('this is server data', data);
        items.push(data);
        socketServer.emit('message', items);
      })
    });
    server.listen(3001, done);
  });

  beforeEach((done) => {
    clientSocket = ioClient('http://localhost:3001', {
      transports: ['websocket'],
      forceNew: true
    });
    clientSocket.on('connect', done);
  });

  afterEach(() => {
    clientSocket.disconnect();
    items = []; // 重置测试数据
  });

  afterAll((done) => {
    socketServer.close();
    server.close(done);
  });

  test('触发连接事件并发送初始消息', (done) => {
    clientSocket.on('message', (receivedItems) => {
      expect(receivedItems).toEqual([]);
      done();
    });
  });

  test('处理客户端消息并广播更新', (done) => {
    const testMsg = { text: 'test content' };
    clientSocket.emit('message', testMsg);
    clientSocket.on('message', (updatedItems) => {
      expect(updatedItems).toContainEqual(testMsg);
      done();
    });
  });
});

2. 检查Jest覆盖率配置

确保jest.config.js里的collectCoverageFrom包含了你的Socket.io服务文件,比如:

module.exports = {
  collectCoverageFrom: [
    './path/to/your/socket-server.js', // 替换成实际文件路径
    '!node_modules/**'
  ]
};

3. 避免完全Mock Socket.io

如果之前的测试用了jest.mock('socket.io')来模拟整个模块,会导致真实的连接逻辑无法执行。应该使用真实的Socket.io实例配合客户端连接,而不是完全Mock。

内容的提问来源于stack exchange,提问作者Harish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:40:38