Я делаю простой магазин и хочу отменить заказы, которые не были захвачены. Я использую Hangfire для этого, и он работает! Но я не могу проверить это должным образом. В документах Hangfire они ничего не упоминают о тестировании повторяющейся работы.
Примечание: я использую WebApplicationFactory
и InMemoryDatabse
.
У меня есть простое дополнение для повторяющейся работы.
RecurringJob.AddOrUpdate(CancelNotGrabbedOrderName, () => CancelNotGrabbedOrder(), Cron.Daily);
и мой простой тест
[Fact]
public async void CancelNotGrabbedOrder_ShouldCancelOrder() {
// Arrange:
using var scope = _factory.Services.CreateScope();
var context = scope.ServiceProvider.GetService<GrabGoContext>();
var hangfireApp = scope.ServiceProvider.GetService<HangfireApp>();
var orderTakeawayTime = DateTimeOffset.UtcNow.AddDays(-1);
var addedOrder = await context.Orders.AddAsync(new Order {
OrderTakeawayTime = orderTakeawayTime,
Status = OrderStatus.ReadyToGrab,
PickupCode = 2202,
BuyerID = 1
});
await context.SaveChangesAsync();
//Act:
RecurringJob.Trigger(HangfireApp.CancelNotGrabbedOrderName);
// Quite sad delay
await Task.Delay(1000);
// Assert
var getResponse = await _adminClient.GetAsync($"api/order/{addedOrder.Entity.Id}");
getResponse.IsSuccessStatusCode.Should().BeTrue();
var order = await getResponse.Content.ReadAsAsync<Order>();
order.Should().NotBeNull();
order.Status.Should().Be(OrderStatus.NotGrabbed);
order.PickupCode.Should().BeNull();
}
Я также заметил, что даже после задержки 10 с и проверки того, что метод CancelNotGrabbedOrder()
(путем отладки) выполняется до того, как var order = await context2.Orders.SingleOrDefaultAsync(o => o.Id == addedOrder.Entity.Id);
все же context
получает информацию о старом (не обновленном) заказе , Может быть, это ошибка в области видимости?
@ Update Эта ошибка, описанная выше (ошибка в области видимости), возникла из-за отсутствия внешнего ключа.
В любом случае ... Как проверить повторяющееся задание Hangfire? Или, может быть, я могу как-то дождаться повторения работы до конца sh? Я не хочу ждать 1 с или около того.