首页 > 解决方案 > 如何为 Hangfire RecurringJob 进行集成测试?

问题描述

我正在做一个简单的商店,我想取消没有抢到的订单。我正在使用 Hangfire 并且它正在工作!但我无法正确测试它。在 Hangfire 文档中,他们没有提到任何关于测试重复工作的内容。

注意:我正在使用WebApplicationFactoryand 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重复工作?或者也许我可以以某种方式等待重复性工作完成?我不想等1s左右。

标签: c#asp.net-core.net-corexunithangfire

解决方案


推荐阅读