Почему клиент SignalR не получает сообщение при выполнении обоих тестов? - PullRequest
0 голосов
/ 28 мая 2019

Первая моя спецификация:

  • .Net Core 2.2
  • SignalR
  • XUnit

Итак, в моем контроллере естьпростой метод REST API для добавления новых Order.И в конце он отправляет сообщение SignalR всем клиентам в группе.Это выглядит так:

public async Task<IActionResult> Post(OrderToAdd orderToAdd) {
    var order = Mapper.Map<Order>(orderToAdd);
    var storeID = _context.Products.Find(order.OrderItems.First().ProductID).StoreId;
    order.OrderTime = DateTime.Now;
    order.Status = OrderStatus.WaitingForPayment;
    var response = await _context.Orders.AddAsync(order);
    await _context.SaveChangesAsync();
    // HERE
    // =====
    await _serviceHub.Clients.Group(storeID.ToString()).OrderAdded(order);
    // ======
    return CreatedAtAction(nameof(GetById), new { id = response.Entity.Id },
        Mapper.Map<OrderDetails>(response.Entity));
}

И у меня есть два простых интеграционных теста

Первый для добавления заказов.

[Fact]
public async void ModelValidate_CorrectOrder_ShouldReturnOk() {
    // Arrange:
    var order = _orderToAdd;
    // Act:
    var response =
        await _httpClient.PostAsync("api/Order", HttpClientHelper.MakeJsonFromObject(order));
    // Assert:
    Assert.Equal(HttpStatusCode.Created, response.StatusCode);
}

и второй для тестирования SignalR

public async void OrderAdded_NewOrder_ShouldReceiveNewOrder() {
    // Arrange:
    var httpClient = await _factory.CreateCustomHttpClientAsync(options => options.UseRole(AvailableRoles.Buyer));
    var hub = await _factory.GenerateHubConnectionAsync("service_hub");
    Order order = null;
    var orderToAdd = new OrderToAdd() {
        OrderTakeawayTime = DateTime.Now.AddMinutes(15),
        OrderItems = new List<OrderItemToAdd>() {
            new OrderItem() {
                Amount = 2,
                ProductID = 1,
                Cost = 10000,
            },
        }
    };
    // Act:
    hub.On<Order>("OrderAdded", addedOrder => { order = addedOrder; });
    var response =
        await httpClient.PostAsync("api/Order", HttpClientHelper.MakeJsonFromObject(orderToAdd));
    response.StatusCode.Should().Be(HttpStatusCode.Created);
    // Assert:
    Assert.NotNull(order);

Все работает нормально, когда запускается только второй тест (тест SignalR).Но когда я запускаю оба теста, метод OrderAdded в hub.On никогда не вызывается.

При отладке (с точки зрения * 1027) я вижу, что мой клиент SignalR подключен и добавлен в группу.Кроме того, строка _serviceHub.Clients.Group(storeID.ToString()).OrderAdded(order); выполняется после того, как я определил свой метод в hub.On, поэтому он должен работать.

Я хотел бы напомнить, что, если я запускаю тест SingalR один, он работает!

Мой вопрос:

Почему клиент SignalR не получает сообщение при выполнении обоих тестов?

@ Update 30.05.2019

Мне удалось сделать что-то действительно уродливое взломать .Если я добавлю Thread.Sleep (100) в мои тесты, он будет работать.

public async void OrderAdded_NewOrder_ShouldReceiveNewOrder() {
    // ---- some test code ----
    // Assert:
    Thread.Sleep(100);
    Assert.NotNull(order);
}

Мне нужно выяснить, как изменить это hack для некоторого кода, управляемого событиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...