首先我的规格:
因此在我的控制器中,我有一个简单的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 。