客户端WebSocket和单元测试

6
我正在一个.NET 4.7应用程序中使用System.Net.WebSockets.ClientWebSocket,当我试图编写依赖于它的可测试代码时,遇到了问题。ClientWebSocket是一个密封类,并定义了两个成员(OptionsConnectAsync),它们不是抽象基类WebSocket的一部分。因此,我不能模拟ClientWebSocket,也不能使用WebSocket,这使得单元测试基本上变得不可能。
我想知道是否有人知道另一种可模拟的.NETWeb套接字客户端(例如仅为ClientWebSocket提供了非常薄的对象适配器)或任何其他可行的方法来测试依赖于ClientWebSocket的代码。
1个回答

7
将WebSocket封装在所需的接口中,然后模拟该接口,以下是缩写方法签名示例:
public interface IWebSocket
{
    Task<string> ReceiveDataAsync(...);
    Task SendDataAsync(...);
    Task CloseAsync(...);

    // Add all other methods you need from the client of the websocket
}

然后实现一个适配器:

public class WebsocketAdapter : IWebSocket
{
    private readonly WebSocket _websocket

    public WebsocketAdapter(Websocket websocket)
    {
        _websocket = websocket;
    }

    public async Task<string> ReceiveDataAsync(...)
    {
        return await _websocket.ReceiveDataAsync(...);
    }

    public async Task SendDataAsync(...)
    {
        return await _websocket.SendDataAsync(...);
    }

    public async Task CloseAsync(...)
    {
        return await _websocket.CloseAsync(...);
    }
}

现在你可以在测试中模拟自己的IWebSocket接口。
这被称为谦虚对象,它是一个仅包装另一个对象或静态方法调用的对象,因此您可以将其隐藏在可模拟的接口后面。

2
这个谦卑的对象就是我当时最终得到的(实际上相当字面)。将其标记为答案。 :) - jasper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接