我在.NET 4.7应用程序中使用System.Net.WebSockets.ClientWebSocket
,并且在尝试制作依赖于可测试代码的代码时遇到问题。 ClientWebSocket
是一个密封类,它定义了两个不属于抽象基类Options
的成员(ConnectAsync
和WebSocket
)。因此,我不能模仿ClientWebSocket
也不能使用WebSocket
,因此基本上不可能进行单元测试。
我想知道是否有人知道.NET的替代Web套接字客户端是可模拟的(即只有一个非常薄的ClientWebSocket
对象适配器就足够了)或任何其他可行的测试代码的方法这取决于ClientWebSocket
。
答案 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,即仅包装另一个对象或静态方法调用的对象,因此您可以将其隐藏在可模拟的接口后面。