如何使用NUnit对Scheduler进行单元测试
本文关键字:单元测试 Scheduler 何使用 NUnit | 更新日期: 2023-09-27 18:13:00
如何使用NUnit对调度程序进行单元测试,它可以允许类似于Outlook调度的调度功能?
调度程序被编程为每天/每周/每月/每年在特定时间或一周/月的特定日期发送消息。
如果我使用硬编码的日期,那么过了一段时间测试用例将会失败。此外,如何测试每月和每年的时间表?
Ram在某个时间点,你的调度程序将检查当前日期,并将其与计划项目进行检查。
如果您确保'Check the current date'部分在另一个组件中是分开的,您可以在单元测试中切换此行为,并让它返回指定的日期。
公共接口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或任何当前使用的),一个为你的测试环境实现它,允许你加速/改变时间。这样,您就可以快速且动态地测试基于时间的功能。
一个非常简单的例子,这将取决于您的调度程序:
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;
}
}
你可以使用像mole这样的工具来处理DateTime。现在http://angler.wordpress.com/2010/01/21/pex-and-moles-untestable-code-not-really/