我目前正在为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应用程序的实例。
感谢大家花时间阅读和思考我的问题。