小编典典

单元测试:DateTime.Now

c#

我有一些单元测试期望’当前时间’与DateTime不同。现在,我显然不想更改计算机的时间。

实现此目标的最佳策略是什么?


阅读 330

收藏
2020-05-19

共1个答案

小编典典

最好的
策略是把当前时间的抽象和注入是抽象到消费者


另外 ,您还可以将时间抽象定义为 环境上下文

public abstract class TimeProvider
{
    private static TimeProvider current =
        DefaultTimeProvider.Instance;

    public static TimeProvider Current
    {
       get { return TimeProvider.current; }
       set 
       {
           if (value == null)
           {
               throw new ArgumentNullException("value");
           }
           TimeProvider.current = value; 
       }
   }

   public abstract DateTime UtcNow { get; }

   public static void ResetToDefault()
   {    
       TimeProvider.current = DefaultTimeProvider.Instance;
   }            
}

这将使您可以像这样使用它:

var now = TimeProvider.Current.UtcNow;

在单元测试中,可以TimeProvider.Current用“测试双精度/模拟”对象替换。使用最小起订量的示例:

var timeMock = new Mock<TimeProvider>();
timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11));
TimeProvider.Current = timeMock.Object;

但是,当在静态状态下进行单元测试时,请务必记住通过调用来 拆开灯具TimeProvider.ResetToDefault()

2020-05-19