在JS项目中模拟WebSocket断开事件应通过Mock实例主动触发close或error事件,推荐使用mock-socket库创建MockServer后调用ws.close(),或用jest.mock轻量替换WebSocket构造函数,确保readyState变为3并正确触发onclose回调。

在 JS 项目中模拟 WebSocket 断开事件,核心思路是**控制 Mock 的 WebSocket 实例主动触发 close 或 error 事件**,而不是依赖真实网络异常。真实断开(如关掉服务端)难控制、不可靠、不利于自动化测试;Mock 方式更稳定、可编程、易集成到单元测试或 E2E 流程中。
使用 mock-socket 主动关闭连接
mock-socket 是最常用的 WebSocket Mock 库,支持服务端和客户端双端模拟。关键在于:创建一个 MockServer 后,拿到对应客户端连接(WebSocket 实例),再手动调用 close() 或触发错误。
- 安装:
npm install mock-socket --save-dev - 启动 Mock Server(例如监听
ws://localhost:8080) - 在测试中新建 WebSocket 连接,等待
open后立即调用ws.close(1001, "Simulated disconnect") - 你的业务代码若监听了
ws.onclose或ws.onerror,此时就会被触发
用原生 WebSocket + jest.mock 替换构造函数(轻量方案)
如果不想引入新库,可在测试环境里直接 mock WebSocket 构造函数,返回一个可控的假实例:
- 在 Jest 测试前,用
jest.mock('websocket', () => {...})或全局替换window.WebSocket - 返回对象需包含
readyState、close()方法,并在调用close()时同步触发onclose回调 - 还可模拟
readyState = 0(CONNECTING)时就报错,覆盖连接失败场景
在真实项目中注入可控断连逻辑(开发/调试用)
非测试场景下(比如本地联调、压测),可通过配置开关,在业务 WebSocket 封装层加入“人工断连”能力:
- 封装一个
MyWebSocket类,内部持有一个真实WebSocket实例 - 暴露
forceDisconnect(code, reason)方法,内部调用this.ws.close(code, reason) - 配合 UI 按钮或快捷键(如 Ctrl+Shift+D)触发,方便前端验证重连逻辑、loading 状态、错误提示等
注意事件触发时机与状态一致性
Mock 断开不是“让连接突然消失”,而是要模拟标准行为:
- 调用
close()后,readyState应立刻变为CLOSED (3) -
onclose回调接收的CloseEvent对象应含code和reason字段(即使只是 mock) - 避免在
onopen前就调用close(),否则可能跳过某些生命周期判断逻辑 - 若业务有自动重连,记得在测试中等待足够时间或用
jest.runOnlyPendingTimers()推进定时器


















