如何用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
相关产品推荐
相关产品推荐

