Testing WebSocket Applications

1. Writing Unit Tests

TargetMock
Message handlerPass parsed object
Encoder/decoderTest pure function
ValidatorValid/invalid fixtures
ReducerState transitions

2. Mocking WebSocket API

Example: mock-socket

import { Server, WebSocket as MockWS } from "mock-socket";
const URL = "ws://localhost:9999/ws";
const server = new Server(URL);
globalThis.WebSocket = MockWS;
server.on("connection", (s) => s.on("message", (m) => s.send(`echo:${m}`)));
LibraryUse
mock-socketBrowser-side WS mock
jest-websocket-mockJest matchers
MSWWebSocket handlers (MSW 2.0+)

3. Testing Message Handlers

PatternDetail
Inject dispatcherCall directly with parsed msg
Assert side effectsState / outbound message
SnapshotReducer output

4. Testing Reconnection Logic

Example: Simulate disconnect

const server = new Server(URL);
const client = createClient(URL);
await waitFor(() => client.state === "open");
server.close();
await waitFor(() => client.reconnectAttempts > 0);
ScenarioAssert
Server dropsBackoff schedule respected
Network offlinePauses attempts
Auth 4401Stops retrying

5. Writing Integration Tests

LayerDetail
Real serverSpin up on random port
Real ws clientNode ws in test
CleanupClose server in afterEach

6. Using WebSocket Test Server

ToolUse
ws + ephemeral portLightweight harness
Autobahn TestSuiteRFC compliance
Echo server (postman-echo)Quick manual checks

7. Testing Error Scenarios

ScenarioExpected
Malformed JSONLog + drop, no crash
Oversize messageClose 1009
Bad UTF-8Close 1007
Server crash mid-msgClient reconnects

8. Load Testing

Example: k6 script

import ws from "k6/ws";
export const options = { vus: 1000, duration: "5m" };
export default function () {
  ws.connect("wss://api.example.com/ws", (socket) => {
    socket.on("open", () => socket.send(JSON.stringify({ "type":"ping" })));
    socket.setTimeout(() => socket.close(), 30000);
  });
}
MetricWatch
Connection success rate> 99%
Avg open time< 500ms
Server CPU/memStable

9. Testing Security

TestDetail
Origin spoofingServer rejects unknown
Invalid tokenClose 4401
IDOR via topicForbidden access denied
Replay attackNonce/id enforcement
Fuzz payloadNo server crash

10. Implementing E2E Tests

ToolDetail
PlaywrightBuilt-in WS interception
Cypress + cy-websocketPlugin support
PuppeteerChrome DevTools Protocol