ClientWebSocket和单元测试

时间:2018-06-12 09:34:51

标签: .net unit-testing websocket

我在.NET 4.7应用程序中使用System.Net.WebSockets.ClientWebSocket,并且在尝试制作依赖于可测试代码的代码时遇到问题。 ClientWebSocket是一个密封类,它定义了两个不属于抽象基类Options的成员(ConnectAsyncWebSocket)。因此,我不能模仿ClientWebSocket也不能使用WebSocket,因此基本上不可能进行单元测试。

我想知道是否有人知道.NET的替代Web套接字客户端是可模拟的(即只有一个非常薄的ClientWebSocket对象适配器就足够了)或任何其他可行的测试代码的方法这取决于ClientWebSocket

1 个答案:

答案 0 :(得分:2)

在所需的接口中包装WebSocket,然后模拟该接口

带有缩写方法签名的示例:

["-ti", "-v", "/sys/fs/cgroup:/sys/fs/cgroup:ro", "-v", "/tmp/$(mktemp -d):/run"]

然后实现一个适配器:

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(...); } } 界面。

这称为Humble Object,即仅包装另一个对象或静态方法调用的对象,因此您可以将其隐藏在可模拟的接口后面。