Первая моя спецификация:
- .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 для некоторого кода, управляемого событиями.