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

本文关键字:单元测试 Scheduler 何使用 NUnit | 更新日期: 2023-09-27 18:13:00

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

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

如果我使用硬编码的日期,那么过了一段时间测试用例将会失败。此外,如何测试每月和每年的时间表?

Ram

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

在某个时间点,你的调度程序将检查当前日期,并将其与计划项目进行检查。

如果您确保'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/