如何使用NUnit对调度程序进行单元测试,这可以允许类似于Outlook调度的调度功能?
计划程序被编程为在特定时间或每周/每月的特定日期每天/每周/每月/每年发送消息。
如果我使用硬编码日期,那么在某些时候测试用例将失败。还有如何测试月度和年度计划?
-
拉姆
答案 0 :(得分:1)
将调度程序的日期和时间检查抽象为单独的接口。有一个为您的实时代码/环境(使用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;
}
}
答案 1 :(得分:1)
在某个时间点,您的计划程序将检查当前日期,并将根据计划的项目进行检查。
如果确保在另一个组件中分离了“检查当前日期”部分,则可以在单元测试中切换此行为并让它返回指定日期。
公共接口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; }
}
答案 2 :(得分:0)
您可以使用Moles等工具来处理DateTime.Now http://angler.wordpress.com/2010/01/21/pex-and-moles-untestable-code-not-really/