模拟 DateTime 来测试预定事件

问题描述 投票:0回答:4

我想模拟日期时间。假设我有要执行的操作列表,每个操作都有一个日期时间字段。当该日期时间到来时,应该执行该操作。

我可以使用 DateTime.Now 检查日期时间,但是如何模拟 DateTime?我的意思是如果当前时间是下午 2 点。行动应该在下午 4 点、5 点进行。我可以使用模拟当前时间到下午 4 点来执行第一个操作,一小时后执行第二个操作吗?

c# datetime simulation
4个回答
2
投票

前段时间我发布了一些关于这样测试日期的方法:

http://ivowiblo.wordpress.com/2010/02/01/how-to-test-datetime-now/

希望有帮助


1
投票

实现此目的的最简单方法是将系统时钟更改为“测试时间”,运行测试,然后更改回来。 这非常老套,我真的不推荐它,但它会起作用。

更好的方法是使用

DateTime.Now
的抽象,这将允许您注入静态值或操纵检索到的值进行测试。鉴于您希望测试值“勾选”,而不是保持静态快照,最简单的方法是向“现在”添加
TimeSpan

因此添加一个名为“offset”的应用程序设置,可以将其解析为

TimeSpan

<appSettings>
    <add key="offset" value="00:00:00" />
</appSettings>

然后每次检索时将此值添加到您的

DateTime.Now

public DateTime Time
{ 
    get 
    { 
        var offset = TimeSpan.Parse(ConfigurationManager.AppSettings["offset"]);
        return DateTime.Now + offset;
    }
}

要在未来运行这一小时二十分钟,您只需调整

offset

<add key="offset" value="01:20:00" />
理想情况下,您会为

DateTime

 创建一个接口并实现依赖注入,但出于您的目的 - 尽管这是首选 - 我建议这打开的蠕虫罐会给您带来一个混乱的世界。这很简单并且会起作用。


1
投票
这实际上是一个复杂的问题,但幸运的是有一个解决方案:

Noda Time


1
投票
最简单的方法是注释掉检查 DateTime.Now 的部分并创建一个新的方法/属性,您可以调用它来返回一组脚本化的时间。

例如:

class FakeDateTime { private static int currentIndex = -1; private static DateTime[] testDateTimes = new DateTime[] { new DateTime(2012,5,8,8,50,10), new DateTime(2012,5,8,8,50,10) //List out the times you want to test here }; /// <summary> /// The property to access to check the time. This would replace DateTime.Now. /// </summary> public DateTime Now { get { currentIndex = (currentIndex + 1) % testDateTimes.Length; return testDateTimes[currentIndex]; } } /// <summary> /// Use this if you want to specifiy the time. /// </summary> /// <param name="timeIndex">The index in <see cref="testDateTimes"/> you want to return.</param> /// <returns></returns> public DateTime GetNow(int timeIndex) { return testDateTimes[timeIndex % testDateTimes.Length]; } }

如果您想要更具体(或更好)的答案,请提供一些代码示例。

© www.soinside.com 2019 - 2024. All rights reserved.