C#ASP.NET,用Microsoft.AspNetCore.mvc测试WebSocket

4sup72z8  于 2022-11-11  发布在  C#
关注(0)|答案(1)|浏览(160)

我目前正在为一个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似乎没有影响
slsn1g29

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

相关问题