You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:02:32