如何在 C# Core 2.1 中模拟 this.HttpContext.WebSockets.AcceptWebSocketAsync()

How to Mock this.HttpContext.WebSockets.AcceptWebSocketAsync() in c# core 2.1

我正在尝试模拟 this.HttpContext.WebSockets.AcceptWebSocketAsync() 的调用,其中 returns 一个 WebSocket 对象。 我的class如下:

public abstract class HttpContext
{
    protected HttpContext();
    public abstract WebSocketManager WebSockets { get; }
}

public abstract class WebSocketManager
{
    protected WebSocketManager();
    public abstract Task<WebSocket> AcceptWebSocketAsync(string subProtocol);
}

using (var webSocket = Task.Run(async () => await 
this.HttpContext.WebSockets.AcceptWebSocketAsync()))
{​​​​
    socketConn.CreateConnectionHandler(obj1, obj2, webSocket.Object);
}​​​​

我也尝试通过接口模拟 CreateConnectionHandler 方法,但在内部它使用的是具体对象,因此没有帮助。 如何模拟 HttpContext 以获取 WebSocket 方法模拟对象。? 任何线索将不胜感激。

为了用模拟的 WebSocketManager 模拟 HttpContext,您只需要 Mock<> 所需的 class,并使用 Setup() 委托来return 具有 Return(**.Object):

的实例化模拟对象

模拟的 WebSocket:

Mock<System.Net.WebSockets.WebSocket> mockedWebSocket = new Mock<System.Net.WebSockets.WebSocket>();
mockedWebSocket
    .Setup(x => x.SendAsync(It.IsAny<ArraySegment<byte>>(),
                It.IsAny<System.Net.WebSockets.WebSocketMessageType>(),
                It.IsAny<bool>(),
                It.IsAny<CancellationToken>()))
    .Returns(Task.FromResult(true)); //Assuming boolean result - you will need to changed the return value according to the test case.

模拟的 WebSocketManager:

Mock<WebSocketManager> mockedWebSocketManager = new Mock<WebSocketManager>();
mockedWebSocketManager
    .Setup(x => x.AcceptWebSocketAsync())
    .Returns(Task.FromResult(mockedWebSocket.Object));

模拟的 HttpContext:

Mock<HttpContext> mockedHttpContext = new Mock<HttpContext>();
    mockedHttpContext.Setup(x => x.WebSockets)
    .Returns(mockedWebSocketManager.Object);

请加using Moq;