我目前正在为一个WebSocket连接编写一个集成测试。我想测试一个ClientWebSocket连接对一个由Microsoft.AspNetCore.Mvc.Testing
示例化的服务器。这似乎不工作。有人知道如何让它工作吗?
我的设置如下:
- 我有一个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应用程序并对该示例执行代码时,一切都按预期工作。
当我尝试用Microsoft.AspNetCore.Mvc.Testing
运行它时,我得到了一个异常,即服务器拒绝了连接。
在某种程度上,这对我来说是有意义的,因为ClientWebSocket没有使用WebApplicationFactory生成的任何东西。(例如_application.Server.CreateWebSocketClient
。另一方面,我确实希望在我的代码中使用ClientWebSocket,而不是将Microsoft.AspNetCore.Mvc.测试的WebSocketClient注入到我的生产代码中。与http相反,我实际上得到了一个常规的HttpClient,我可以很好地将其注入。
有没有人知道,我如何才能让集成测试与ClientWebSocket一起工作?是否有可能重用服务器Microsoft.AspNetCore.Mvc.Testing启动请求,而不是WebApplicationFactory生成的请求?Microsoft.AspNetCore.Mvc.Testing是否将API应用程序作为服务器运行?或者后台是否有什么黑魔法?
我目前检查的内容:
- _href是正确的
_application.Server.BaseAddress
似乎没有影响
1条答案
按热度按时间slsn1g291#
我想做的事情根本不可能。下面帖子的答案把我推向了正确的方向。Inject HttpClient from WebApplicationFactory
如果你知道你要找什么,这与官方文档相匹配:https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0
因此,我只能使用WebApplicationFactory提供的内容访问Web API应用程序的示例,而不能通过本地网络访问Web API应用程序的示例。
感谢大家花时间阅读和思考我的问题。