我有一些单元测试期望’当前时间’与DateTime不同。现在,我显然不想更改计算机的时间。
实现此目标的最佳策略是什么?
在 最好的 策略是把当前时间的抽象和注入是抽象到消费者。
另外 ,您还可以将时间抽象定义为 环境上下文 :
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用“测试双精度/模拟”对象替换。使用最小起订量的示例:
TimeProvider.Current
var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;
但是,当在静态状态下进行单元测试时,请务必记住通过调用来 拆开灯具TimeProvider.ResetToDefault()。
TimeProvider.ResetToDefault()