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

4
我正在我的应用程序中的调度器项目(类库)中使用Quartz.NET,这是因为我希望其他项目对实际实现不知情。将来,如果我想要将Quartz更改为Castle Scheduler或Windows Scheduler或其他任何东西...我将有灵活性进行更改。
我需要在我的Quartz.NET项目上对每周触发器进行单元测试,我开始研究并发现目前似乎是一个很酷的解决方案MOLES,该扩展基本上允许我更改DateTime.Now并进入未来!
在这种情况下,从现在开始一周后,当触发器计划触发时,但等待一段时间后发现我的触发器没有被激活,即使更改了时间并Thread.Sleeping几分钟...
我之所以想要进入未来,是因为在应用程序中,我对每种请求类型都使用不同的方法/触发器,例如每周,每周重复,每月,每年。
还有其他人单元测试过这种情况吗?
我是否漏掉了什么?

在 MOLES 中是否可能?


2
触发器有像GetFireTimeAfter(DateTime)这样的方法,可以告诉您下一个预期的触发时间。测试那个不就足够了吗? - Marko Lahma
问题是我正在将Quartz.net包装成我的项目中的外观,以便对其他项目透明,我想从外部测试它,而不是直接在Quartz.net触发器上进行测试,因为外部应用程序甚至不知道Quartz触发器的存在。 - Bongo Sharp
我简直无法相信没有其他人曾经发现自己处于这种境地。。。 - Bongo Sharp
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等依赖注入容器一起使用。
注意:有关更多参考信息,请参阅此post中讨论的类似实现建议。

Quartz.NET的当前开发实际上已经有了这个功能,只是还没有发布。 - Marko Lahma
你知道那个什么时候发布吗?我想在周末研究一下QUARTZ.net代码并且自己实现它...但是我会被困在这个特定版本的quartz里面,我不是很喜欢这样。 - Bongo Sharp

2

我还没有测试过,但是在使用 Moles 时,你是否更改了 DateTimeOffset 或 DateTime?Quartz.Net 使用 DateTimeOffset.UtcNow:

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

我认为你应该能够在不使用 Moles 的情况下完成这个操作,只需要编写以下代码:

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

当你想要进入未来五天时 :)

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

https://github.com/lahma/quartznet


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接