C#ASP.NET,使用Microsoft.AspNetCore.Mvc.testing测试websocket



我目前正在为websocket连接编写集成测试。我想针对Microsoft.AspNetCore.Mvc.Testing实例化的服务器测试ClientWebSocket连接。这似乎不起作用。有人知道如何让它发挥作用吗?

我的设置如下:

  • 我有一个API应用程序,它提供了一些普通的http端点和一个websocket
  • 我有一些应用程序代码,它建立了一个websocket连接
  • 我有集成测试,这些测试使用Microsoft.AspNetCore.Mvc.Testing实例化API应用程序,并使用我的应用程序代码对其进行测试

我一般如下https://learn.microsoft.com/de-de/aspnet/core/test/integration-tests?view=aspnetcore-6.0.这对于普通的HTTP(S(端点非常有效。我的代码如下:

_application = new WebApplicationFactory<Program>().WithWebHostBuilder(builder => { });
//HttpClient for http endpoints
_client = _application.CreateClient();

WebSocket端点的创建方式如下所述:https://learn.microsoft.com/de-de/aspnet/core/fundamentals/websockets?view=aspnetcore-6.0

app.Use(async (context, next) =>
{
if (context.Request.Path == "/"+nameof(TestModel.WebsocketEvent))
{
if (context.WebSockets.IsWebSocketRequest)
{
TestModel.Instance.WebsocketEvent = await context.WebSockets.AcceptWebSocketAsync();
await ListenForClose(TestModel.Instance.WebsocketEvent);
}
}
}

对于到端点的连接,我在要测试的代码中使用ClientWebsocket。

var ws = new ClientWebSocket();
await ws.ConnectAsync(_href, cancellation);

当我手动运行API应用程序并针对该实例执行代码时,一切都能按预期工作。WebSocket连接已建立。

当我尝试用Microsoft.AspNetCore.Mvc.Testing运行它时,我得到一个异常,即服务器拒绝了连接。

在某种程度上,这对我来说是有意义的,因为ClientWebSocket没有使用WebApplicationFactory生成的任何东西。(例如_application.Server.CreateWebSocketClient。另一方面,我确实想在我的代码中使用ClientWebSocket,而不是将Microsoft.AspNetCore.Mvc.Testing的WebSocketClient注入到我的生产代码中。与http相反,在http中,我实际上得到了一个普通的HttpClient,我可以很好地注入它。

有人知道我如何使用ClientWebSocket进行集成测试吗?是否有可能重复使用服务器Microsoft.AspNetCore.Mvc.Testing启动用于WebApplicationFactory生成的请求以外的请求?Microsoft.AspNetCore.Mvc.Testing是否正在将API应用程序作为服务器运行?或者背景中有一些黑色魔法?

到目前为止我检查了什么:

  • _href正确
  • _application.Server.BaseAddress似乎没有影响

我想做的根本不可能。以下线索的答案将我推向了正确的方向。从WebApplicationFactory 注入HttpClient

如果你知道自己在寻找什么,这与官方文档相匹配:https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0

因此,我只能使用WebApplicationFactory提供的内容访问Web API应用程序的实例。我无法通过本地网络访问Web API应用程序的实例。

感谢大家花时间阅读和思考我的问题。

最新更新