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

如何用Jest对SocketIO链式调用函数进行Spy测试?

Jest测试SocketIO链式调用的解决方案

问题核心:io.to(id)返回的是新的SocketIO房间/命名空间对象,而非原io实例,所以直接监听io.emit捕获不到链式调用中的emit调用。

简洁解决方案

通过让to方法的Spy返回一个包含mockemit函数的对象,就能完整捕获链式调用:

// 1. 先创建emit的mock函数
const emitMock = jest.fn();

// 2. 监听io.to方法,让它返回带有emitMock的对象
const toSpy = jest.spyOn(io, 'to').mockReturnValue({
  emit: emitMock
});

// 执行你的业务逻辑(io.to(id).emit(...))
// ...

// 3. 断言验证
expect(toSpy).toHaveBeenCalledTimes(1);
expect(toSpy).toHaveBeenCalledWith(id); // 可选:验证to的参数是否正确
expect(emitMock).toHaveBeenCalledTimes(1);
expect(emitMock).toHaveBeenCalledWith('hello', { data: data }); // 验证emit的参数

进阶场景(保留原to方法部分行为)

如果需要to方法返回的对象保留原实例的其他属性,可改用mockImplementation自定义返回逻辑:

const emitMock = jest.fn();
const toSpy = jest.spyOn(io, 'to').mockImplementation((roomId) => {
  // 调用原to方法获取真实返回对象
  const originalReturn = io.to(roomId);
  // 替换emit方法为mock函数
  return { ...originalReturn, emit: emitMock };
});

// 后续断言逻辑同上

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:43:08