Как сделать интеграционные тесты для Hangfire RecurringJob? - PullRequest
2 голосов
/ 14 апреля 2020

Я делаю простой магазин и хочу отменить заказы, которые не были захвачены. Я использую 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 с или около того.

...