如何使用NUnit单元测试调度程序,该调度程序可以允许与Outlook调度类似的调度功能?如何使用NUnit单元测试调度程序
调度程序被编程为每天/每周/每月/每年在特定时间或特定的一周/每月发送消息。
如果我使用硬编码日期,那么在某些情况下测试用例会失败。另外如何测试每月和每年的时间表?
-
拉姆
如何使用NUnit单元测试调度程序,该调度程序可以允许与Outlook调度类似的调度功能?如何使用NUnit单元测试调度程序
调度程序被编程为每天/每周/每月/每年在特定时间或特定的一周/每月发送消息。
如果我使用硬编码日期,那么在某些情况下测试用例会失败。另外如何测试每月和每年的时间表?
-
拉姆
摘要的日期和时间检查调度到一个单独的接口。有一个类为您的实时代码/环境(使用DateTime或当前使用的任何类型)实现此接口,并为您的测试环境实现该接口,从而可以加速/更改时间。这样您就可以快速,即时地测试基于时间的功能。
一个非常简单的例子,这将取决于你的调度程序有所不同:
public interface IDateTimeProvider
{
DateTime CurrentDateTime { get; }
}
public class DateTimeProvider : IDateTimeProvider
{
public DateTime CurrentDateTime
{
get { return DateTime.Now; }
}
}
public class TestDateTimeProvider : IDateTimeProvider
{
public DateTime CurrentDateTime { get; set; }
}
public class Scheduler
{
private readonly IDateTimeProvider DateTimeProvider;
public Scheduler(IDateTimeProvider provider)
{
DateTimeProvider = provider;
}
}
在某个时间点你计划将检查当前的日期,并会检查它是否能按原定项目。
如果您确保'检查当前日期'部分在另一个组件中是分开的,您可以在单元测试中切换此行为并让它返回指定的日期。
公共接口IDateTimeManager { 的DateTime GetCurrentDateTime(); }
class ProductionDateTimeManager : IDateTimeManager
{
public DateTime GetCurrentDateTime()
{
throw new NotImplementedException();
}
}
public class Scheduler
{
public Scheduler(IDateTimeManager dateTimeManager)
{
this.DateTimeManager = dateTimeManager;
}
public Scheduler()
{
this.DateTimeManager = new ProductionDateTimeManager();
}
public void Execute()
{
DateTime current = DateTimeManager.GetCurrentDateTime();
}
private IDateTimeManager DateTimeManager { get; set; }
}
可以使用工具样痣处理DateTime.Now http://angler.wordpress.com/2010/01/21/pex-and-moles-untestable-code-not-really/
提供您所提到的问题,否则没有任何意义和即将关闭的调度器界面 – sll