如何使用NUnit对Scheduler进行单元测试

时间:2011-11-02 10:39:28

标签: c# .net unit-testing nunit

如何使用NUnit对调度程序进行单元测试,这可以允许类似于Outlook调度的调度功能?

计划程序被编程为在特定时间或每周/每月的特定日期每天/每周/每月/每年发送消息。

如果我使用硬编码日期,那么在某些时候测试用例将失败。还有如何测试月度和年度计划?

-

拉​​姆

3 个答案:

答案 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)