Testing TestHost.WebSocketClient with ClientWebSocket .net core
Я собрал веб-приложение WebSocket в ядре.net, следуя этим и этим или этим учебникам. Сейчас я пытаюсь написать некоторые интеграционные тесты по этому вопросу, используя Microsoft.AspNetCore.TestHost
Как я создаю WebSocket
public static WebSocketClient StartWebSocketServer(string url)
{
var baseAddress = $"http://{url}";
var builder =
WebHost.CreateDefaultBuilder(new string[]{})
.UseEnvironment("Development")
.ConfigureLogging((ctx, logging) => logging.AddConsole())
.UseUrls(baseAddress)
.UseStartup<SocketsTestStartup>();
var server = new TestServer(builder);
return server.CreateWebSocketClient();
}
И создание клиента websocket выполняется в коде ниже
ClientWebSocket testAppClient = new ClientWebSocket();
await
testAppClient
.ConnectAsync(
new Uri("ws://loclahost:52015/local"),
CancellationToken.None);
local
это имя пути на сервере веб-сокетов
Startup.cs
app.MapWebSocketManager(
"/local",
serviceProvider.GetService<LocalServiceSocketHandler>());
Во всяком случае, соединение выдает следующую ошибку
System.Net.WebSockets.WebSocketException : Unable to connect to the remote server
Мой вопрос как я могу спросить ClientWebSocket
подключиться к TestHost.WebSocketClient
?
3 ответа
Используя TestServer, с моей стороны работает следующее, и на всякий случай это может помочь кому-то еще, вот код:
var builder = WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.UseEnvironment("Development");
var server = new TestServer(builder);
var wsClient = server.CreateWebSocketClient();
var wsUri = new UriBuilder(server.BaseAddress)
{
Scheme = "ws"
}.Uri;
await wsClient.ConnectAsync(wsUri, CancellationToken.None);
Но так как оригинальный вопрос использует путь /local
нужно просто указать Path
имущество:
var wsUri = new UriBuilder(server.BaseAddress)
{
Scheme = "ws",
Path = "local"
}.Uri;
Вместо TestServer я использовал следующий код для запуска веб-приложения WebSocket.
public static IWebHost CreateServer(int port)
{
var configBuilder = new ConfigurationBuilder();
configBuilder.AddInMemoryCollection();
var config = configBuilder.Build();
config["server.urls"] = $"http://localhost:{port}";
var host = new WebHostBuilder()
.ConfigureLogging((ctx, logging) => logging.AddDebug())
.UseConfiguration(config)
.UseKestrel()
.UseStartup<SocketsTestStartup>()
.Build();
host.Start();
return host;
}
В основном я нашел решение из тестов aspnet / WebSockets
Этот код работал для меня в приложении корпоративного уровня, которое мы разработали (см. Весь код здесь: https://github.com/saturn72/Programmer)
//Create test server
var server = new TestServer(builder);
//create websocket client, connect it and to server
var wsc = server.CreateWebSocketClient();
var uri = new Uri(BaseUri, "ws");
var webSocket = wsc.ConnectAsync(uri, CancellationToken.None).Result;
var buffer = WebSocket.CreateClientBuffer(1024, 1024);
//Start receive data
Task.Run(()=> WebSocket.ReceiveAsync(_buffer, CancellationToken.None));
Голая в виду это async
и вам нужно установить некоторую задержку в вашем тесте