我需要模拟引用DateTime.utcNow的应用程序。
我想更改返回的时间,但不想弄乱我的电脑和任务计划器等。
是否可以更改从DateTime.Now和DatetIme.utcNow返回的内容,纯粹是在程序本身的上下文中?
答案 0 :(得分:1)
在不实施依赖注入的情况下执行此操作的最简单方法是将所有对DateTime.UtcNow
的调用替换为SystemTime.UtcNow()
并添加以下类。
public static class SystemTime
{
public static Func<DateTime> UtcNow = () => DateTime.UtcNow;
}
然后在您的模拟代码中,您可以用
替换返回的代码SystemTime.UtcNow = () => new DateTime(2000,1,1);
不要忘记您可能需要对DateTime.Now
,DateTime.Today
等执行相同操作。此外,您还可以添加一项功能,以便您可以返回正常& #39;行为SystemTime.Reset()
。
public static class SystemTime
{
public static Func<DateTime> UtcNow = () => DateTime.UtcNow;
public static Func<DateTime> Now = () => DateTime.Now;
public static Func<DateTime> Today = () => DateTime.Today;
public static void Reset()
{
UtcNow = () => DateTime.UtcNow;
Now = () => DateTime.Now;
Today = () => DateTime.Today;
}
}