单元测试:隔离 DateTime.Now
在进行单元测试时,经常需要控制当前时间,而无需更改系统的时钟。当代码依赖于 DateTime.Now 时,这就会带来挑战。
最佳方法是围绕 DateTime.Now 创建一个抽象层。将此抽象注入到被测试的代码中,允许您在单元测试期间模拟当前时间。
替代方案:环境上下文
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;
在单元测试中:
var timeMock = new Mock<TimeProvider>(); timeMock.SetupGet(tp => tp.UtcNow).Returns(new DateTime(2010, 3, 11)); TimeProvider.Current = timeMock.Object;
但是,务必通过调用 TimeProvider.ResetToDefault() 来清理您的测试夹具,以避免干扰后续测试。
以上是如何隔离'DateTime.Now”以进行有效的单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!