gpt4 book ai didi

c# - 单元测试 : DateTime. 现在

转载 作者:IT王子 更新时间:2023-10-29 03:32:27 26 4
gpt4 key购买 nike

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

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

最佳答案

最佳策略是wrap the current time in an abstraction and inject that abstraction into the consumer .


或者,您还可以将时间抽象定义为环境上下文:

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 替换为 Test Double/Mock 对象。使用最小起订量的示例:

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

但是,当使用静态进行单元测试时,请始终记住通过调用 TimeProvider.ResetToDefault()拆除您的夹具

关于c# - 单元测试 : DateTime. 现在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2425721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com