未来C#中的单元测试调度程序

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

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

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

我想要展望未来的原因是因为在应用程序中我正在为每种请求使用不同的方法/触发器E.G.每周,每周复发,每月,每年

有没有其他人单位测试过这种情况?

有什么东西我路过吗?

MOLES可以吗?

如何实现类似的东西

public interface IClock
{
    DateTime Now { get; }
}

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

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

在开发外观时,可以通过将对DateTime.Now的每个调用替换为IClock.Now来使代码依赖于IClock.

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

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

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

注:有关进一步参考,请参见本post中讨论的类似实施方案.