【问题标题】:Quartz.net + testing with SystemTime.UtcNowQuartz.net + 使用 SystemTime.UtcNow 进行测试
【发布时间】:2013-12-04 17:08:57
【问题描述】:

我正在尝试通过创建作业来使用示例代码测试 Quartz.net dll。但我想更改系统时间并测试一些情况,例如:我正在尝试设置这个 SystemTime.UtcNow = () => new DateTime(2013,11,23,58,00);在创建之前在我的测试控制台应用程序中添加了一个作业以在 .WithCronSchedule("0 59 23 ? * *") 处打勾,但它没有打勾……不确定 SystemTime 是否生效。

下面的示例代码:

    ISchedulerFactory sf = new StdSchedulerFactory();
    IScheduler sched = sf.GetScheduler();

    SystemTime.UtcNow = () => new DateTime(2013, 12, 04, 23, 58, 00);
    SystemTime.Now = () => new DateTime(2013, 12, 04, 23, 58, 00);

    ////TEST
    IJobDetail job = JobBuilder.Create<SimpleJob>()
        .WithIdentity("job1", "group1")
        .Build();

    ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                              .WithIdentity("trigger1", "group1")
                                              .WithCronSchedule("0 59 23 ? * *")        
                                              .Build();

【问题讨论】:

    标签: quartz.net


    【解决方案1】:

    您是否尝试过将SystemTime 设置为准确的预定时间或稍晚一点?您的 SystemTime 值不会改变,如果 Quartz.Net 尝试检查作业是否应该使用该委托运行,实际上永远不会是在您的测试中运行它的正确时间。

    【讨论】:

    • 是的,我尝试将我的 systemTime 设置为与在执行代码之前为 SystemTime.UtcNow 设置的相同。还是一样,没有触发。
    • SystemTime 将始终调用您提供的固定委托。时间不会改变,工作也不会被触发,因为 Quartz 认为它一直是 23:58。您可能应该重新审视您的测试策略,直接使用触发器进行测试并测试 GetFireTimeAfter/GetNextFireTimeUtc 方法。
    • 您好,感谢您的指出。如果您可以为我在上面的测试代码中尝试测试的场景提供一个示例,那将会很有帮助。
    • IIS运行时,它已经读取了系统时间,如果你稍后更改它,它不会欺骗网络应用程序。
    猜你喜欢
    • 2023-03-19
    • 2011-03-01
    • 1970-01-01
    • 2013-02-05
    • 2011-10-10
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多