为什么在运行两个测试时SignalR客户端都没有收到消息?

时间:2019-05-28 10:13:24

标签: c# asp.net-core signalr xunit

首先我的规格:

  • .Net Core 2.2
  • SignalR
  • XUnit

因此在我的控制器中,我有一个简单的REST API方法来添加新的Order。最后,它向Group中的所有客户端发送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永远不会被调用。

在调试中(从Controller来看),我可以看到SignalR客户端已连接并添加到组中。此外,在_serviceHub.Clients.Group(storeID.ToString()).OrderAdded(order);中定义了我的方法之后,执行了行hub.On,所以它应该可以工作。

我想提醒一下,如果我单独运行SingalR测试,它会起作用!

我的问题是:

为什么在运行两个测试时SignalR客户端都没有收到消息?

@更新30.05.2019

我设法做了一些非常丑陋的 hack 。如果我将Thread.Sleep(100)放入测试中,则可以正常工作。

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

我需要弄清楚如何更改某些事件驱动代码的 hack

0 个答案:

没有答案