4

我在我的应用程序的调度程序项目(类库)中使用quartz.NET,这是因为我希望其他项目与实际实现无关。将来,如果我想为 Castle Scheduler 或 Windows Scheduler 或 wathever 更改石英……我将可以灵活地更改它。

我需要在我的 Quartz.NET 项目上对每周触发器进行单元测试,我开始研究并发现目前看起来很酷的解决方案MOLES这个扩展基本上允许我更改 DateTime.Now 并走向未来!

在这种情况下,从现在开始的一个星期,当触发器被安排触发时,但在等待了一段时间后悲伤地发现我的触发器没有被激活,即使改变时间和 Thread.Sleeping 几分钟......

我想去未来的原因是因为在应用程序中我对每种请求使用不同的方法/触发器 EG 每周、每周重复、每月、每年

有没有其他人对这种情况进行过单元测试?

有什么我路过的吗?

MOLES 可以吗?

4

2 回答 2

5

如何实施类似的东西

public interface IClock
{
    DateTime Now { get; }
}

public class FakeClock : IClock
{
    DateTime Now { get; set; }
}

public class SystemClock : IClock
{
    DateTime Now { get { return DateTime.Now; } }
}

当你开发一个外观时,你可以让你的代码依赖于 IClock,方法是将每个对 DateTime.Now 的调用替换为 IClock.Now。

IClock 依赖项可以作为构造函数参数传递,也可以直接传递给需要它的每个方法。

然后,您的生产代码将使用 SystemClock 实例,您的测试可以依赖 FakeClock 类型来操纵时间并验证某些操作是否在预期的瞬间发生。

这种设计(控制反转)极大地受益于使用依赖注入容器,如 Castle Windsor、StructureMap、AutoFac ......

注意:为了进一步参考,本文讨论了类似的实施建议

于 2011-02-05T12:11:26.023 回答
1

我还没有对此进行测试,但是当您尝试 Moles 时,您是否更改了 DateTimeOffset 或 DateTime?Quartz.Net 使用 DateTimeOffset.UtcNow:

https://fisheye3.atlassian.com/browse/quartznet/src/Quartz/SystemTime.cs?hb=true

我认为您应该能够在不使用痣的情况下做到这一点,尽管我也没有测试过,只需写

SystemTime.UtcNow = () => new DateTimeOffset(DateTime.Now.AddDays(5)).UtcNow

当你想在未来五天时:)

请注意,SystemTime 功能要求您从源代码构建 Quartz,您可以在 github 上获取源代码:

https://github.com/lahma/quartznet

于 2011-04-01T04:43:06.773 回答