c# - 如何为 Hangfire RecurringJob 进行集成测试?
问题描述
我正在做一个简单的商店,我想取消没有抢到的订单。我正在使用 Hangfire 并且它正在工作!但我无法正确测试它。在 Hangfire 文档中,他们没有提到任何关于测试重复工作的内容。
注意:我正在使用WebApplicationFactory
and 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左右。
解决方案
推荐阅读
- javascript - 数组推送不起作用
- sql - 按另一列排序一列的有效方法
- entity-framework - .NET CORE 3.1 - 实体框架 - 无法映射 IndexOf
- node.js - 如何通过 cli 将文件路径传递给 npm packge
- docker - 需要的建议:在同一主机上的多个 Web 服务之间共享 LE 通配符证书时的最佳实践
- android - 贴纸位置在图像上拖动贴纸的问题
- javascript - 无法使用 React.js 让普通的 Three.js React 组件跨越 CSS Grid 的宽度
- c# - 我可以按元素属性将列表拆分为更小的列表吗
- php - Laravel 在变换方法中继续循环
- python-3.x - Selenium webdriver 无法获取元素