.NET Core(C#)中如何用WireMock.Net模拟WebSocket连接
在WireMock.Net中配置WebSocket端点用于集成测试
WireMock.Net从v1.5.0版本开始正式支持WebSocket协议,以下是具体的配置和测试步骤:
1. 确保依赖版本
首先确认项目中引用的WireMock.Net NuGet包版本不低于v1.5.0,可通过NuGet包管理器或命令行安装:
Install-Package WireMock.Net -Version 1.5.0+
2. 启动WireMock服务器并启用WebSocket支持
启动服务器时,需在配置中显式开启WebSocket支持:
var serverSettings = new WireMockServerSettings { EnableWebSocket = true, Port = 8080 // 可自定义端口,留空则由系统分配 }; var server = WireMockServer.Start(serverSettings);
3. 配置WebSocket端点
根据测试需求,可配置两种类型的WebSocket端点:
3.1 简单Echo端点(自动返回收到的消息)
适合快速验证连接和消息收发逻辑:
// 配置/ws/echo端点,自动回显所有收到的消息 server.GivenWebSocket("/ws/echo") .RespondWithWebSocketEcho();
3.2 自定义逻辑端点
如果需要模拟业务逻辑(比如处理消息后返回特定响应、主动断开连接等),可使用自定义处理器:
server.GivenWebSocket("/ws/custom-handler") .RespondWithWebSocketHandler(async (context, webSocket) => { var buffer = new byte[1024 * 4]; WebSocketReceiveResult result; do { // 接收客户端消息 result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Text) { var receivedMsg = Encoding.UTF8.GetString(buffer, 0, result.Count); // 自定义响应逻辑 var responseMsg = $"Processed: {receivedMsg} (from WireMock)"; // 发送响应给客户端 await webSocket.SendAsync( new ArraySegment<byte>(Encoding.UTF8.GetBytes(responseMsg)), result.MessageType, result.EndOfMessage, CancellationToken.None); } } while (!result.CloseStatus.HasValue); // 处理客户端发起的关闭请求 await webSocket.CloseAsync( result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); });
4. 编写集成测试验证WebSocket功能
使用.NET内置的ClientWebSocket模拟客户端连接并测试:
[Fact] public async Task WebSocket_EchoEndpoint_ShouldReturnReceivedMessage() { // 启动服务器(可放在测试类的Setup方法中) var server = WireMockServer.Start(new WireMockServerSettings { EnableWebSocket = true }); server.GivenWebSocket("/ws/echo").RespondWithWebSocketEcho(); using var client = new ClientWebSocket(); // 连接到WireMock的WebSocket端点 await client.ConnectAsync(new Uri($"ws://localhost:{server.Port}/ws/echo"), CancellationToken.None); // 发送测试消息 var testMessage = "Hello WireMock WebSocket!"; await client.SendAsync( new ArraySegment<byte>(Encoding.UTF8.GetBytes(testMessage)), WebSocketMessageType.Text, endOfMessage: true, CancellationToken.None); // 接收响应 var buffer = new byte[1024 * 4]; var receiveResult = await client.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); var response = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count); // 断言验证 Assert.Equal(testMessage, response); Assert.Equal(WebSocketMessageType.Text, receiveResult.MessageType); // 关闭连接 await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Test completed", CancellationToken.None); server.Stop(); }
注意事项
- WireMock.Net的WebSocket支持基于ASP.NET Core的WebSocket中间件,行为与标准ASP.NET Core WebSocket一致;
- 若需模拟异常场景(如主动断开连接),可在自定义处理器中调用
webSocket.CloseAsync并传入异常状态码; - 测试完成后务必停止WireMock服务器,避免端口占用。
内容的提问来源于stack exchange,提问作者TejSoft
相关产品推荐
相关产品推荐

