websocket单元测试需用mock-socket接管window.websocket,三行代码启动模拟服务,真实触发message/send/close事件流,并覆盖connecting队列、onopen前发送等边界行为,测试后调用server.close()清理。

WebSocket 在单元测试中不能靠 Mock.js 拦截,因为它只处理 HTTP 请求(fetch/XMLHttpRequest),对 new WebSocket() 完全无感知——强行 mock ws:// 地址会直接报错 WebSocket is not defined 或连接成功但 onmessage 不触发。
用 mock-socket 替换全局 WebSocket 实例
真正可行的方式是用 mock-socket 库接管浏览器原生的 window.WebSocket,让所有 new WebSocket(url) 都指向本地模拟服务器。它不改原型、不侵入业务逻辑,三行代码就能启动可交互服务:
- 安装:
npm install mock-socket --save-dev - 在测试入口或
beforeAll中初始化 Server,并确保地址与客户端一致:import { Server } from 'mock-socket';<br>const server = new Server('ws://localhost:8080'); - 客户端仍写
new WebSocket('ws://localhost:8080'),无需任何修改
模拟消息收发:服务端主动响应 + 客户端监听
mock-socket 的服务端实例能真实触发 message、send、close 等行为。关键不是“伪造回调”,而是构造真实事件流:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在
server.on('connection', socket => {...})中监听客户端发来的消息 - 调用
socket.send('hello')→ 触发客户端onmessage - 调用
socket.close(4001, 'Network error')→ 触发客户端onclose和code/reason - 发送非法数据如
socket.send(new ArrayBuffer(0))可触发部分环境下的onerror
覆盖连接状态和边界行为
很多 bug 出现在状态切换的“毛刺”环节,比如:
-
readyState === WebSocket.CONNECTING时调用send()不报错,但消息会排队,等变成OPEN才发出 —— 这个队列行为必须验证 - 服务端在
connection回调里立即send(),但客户端onopen尚未执行,此时onmessage是否能兜底收到?要测 - 手动清理:每个测试后调用
server.close()断开所有连接,避免状态污染
配合测试框架做断言
以 Jest 为例,你可以用 jest.fn() 监听客户端回调,再结合 waitFor 或 Promise 等待异步完成:
- 给
ws.onmessage = jest.fn(),然后断言ws.onmessage.mock.calls.length > 0 - 用
ws.addEventListener('message', handler)时,同样用jest.fn()绑定并校验参数 - 测试重连逻辑?先
server.close(),再检查客户端是否触发了重连动作(比如再次 new WebSocket)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










