Mock WebSocket 的核心是替换全局 WebSocket 构造函数,通过 jest.fn() 模拟实例状态(readyState)、事件触发(dispatchEvent)和方法(send/close),并在测试中验证调用、消息处理与错误逻辑。

在 JavaScript 单元测试中 Mock WebSocket,核心是**替换全局 WebSocket 构造函数**,并控制其连接状态、消息收发和事件触发行为。不需要真实网络连接,重点是让测试能主动模拟 open/close/message/error 等关键生命周期。
用 jest.mock 拦截并重写 WebSocket 构造函数
推荐在测试文件顶部直接 mock 全局 WebSocket,避免污染其他测试:
- 用 jest.mock('ws', ...) 不适用 —— 浏览器环境没有 'ws' 包,mock 的是全局变量 WebSocket
- 正确方式:在 test 文件开头加 global.WebSocket = jest.fn(),再手动定义它的 prototype 方法(如 send、close)和实例属性(如 readyState)
- 注意:必须在 new WebSocket(...) 被调用前完成 mock,否则会使用原生实现
构造可控制的 Mock 实例(含状态与事件)
仅 mock 构造函数不够,还需让每个 new 出来的实例能响应事件、暴露状态、支持断言:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 给 mock 构造函数的 prototype 添加 send、close、dispatchEvent 方法
- 维护实例级 readyState(0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED),并在合适时机更新
- 用 EventTarget 或手动维护 onopen/onmessage/onclose/onerror 回调,测试时通过 instance.onmessage = jest.fn() 捕获消息
- 示例:创建实例后立即触发 open 事件 → instance.dispatchEvent(new Event('open'))
在测试中验证连接逻辑与消息交互
Mock 后的重点不是“它连上了”,而是“它按预期行为响应”:
立即学习“Java免费学习笔记(深入)”;
- 检查 WebSocket 构造函数是否被正确调用(参数 URL 是否匹配)
- 调用 instance.send('data') 后,检查是否有副作用(如调用某回调、更新某状态)
- 手动触发 message 事件:instance.dispatchEvent(new MessageEvent('message', { data: '{"type":"ping"}' })),然后断言处理函数是否被调用
- 模拟异常:设 instance.readyState = 0 后调用 send,或触发 error 事件,验证错误处理逻辑
进阶:用库简化(如 mock-socket)
如果项目中 WebSocket 交互复杂(需多端通信、心跳、重连),可引入轻量库辅助:
- mock-socket 提供类似服务端的 MockServer 和客户端 MockWebSocket,支持双向消息、广播、连接管理
- 它不依赖 jest,兼容其他测试框架;但要注意它仍基于全局替换,需确保加载顺序
- 适合需要模拟多个 client 连接、服务端主动 push、或测试 reconnect 逻辑的场景

















