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 и вам нужно установить некоторую задержку в вашем тесте

Другие вопросы по тегам