1

我想模拟日期时间。假设我有要执行的操作列表,每个操作都有一个日期时间字段。当该日期时间到来时,应该执行该操作。我可以用 DateTime.Now 检查日期时间;但是我怎样才能模拟 DateTime。我的意思是如果当前时间是下午 2 点。行动应该在下午 4 点、5 点运行。我可以使用模拟当前时间到下午 4 点,第一个动作将执行,一小时后将执行第二个动作。

谢谢,

4

4 回答 4

2

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

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

希望能帮助到你

于 2012-05-09T03:37:00.607 回答
1

这实际上是一个复杂的问题,但幸运的是有一个解决方案: 野田时间

于 2012-05-09T03:31:15.000 回答
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];
    }
}

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

于 2012-05-09T03:55:16.163 回答
1

实现这一点的最简单方法是将系统时钟更改为“测试时间”,运行测试,然后再改回来。这很hacky,我真的不推荐它,但它会起作用。

更好的方法是使用抽象DateTime.Now,允许您注入静态值或操作检索到的值以进行测试。鉴于您希望测试值“打勾”,而不是保持静态快照,将 a 添加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" />

理想情况下,您会为 a 创建一个接口DateTime并实现依赖项注入,但出于您的目的 - 尽管这是首选 - 我建议打开的蠕虫罐头将为您创造一个混乱的世界。这很简单并且会起作用。

于 2012-05-09T04:17:06.773 回答