2012-05-09 75 views
0

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

感谢,

+0

时间应该从下午4点开始继续。即它应该像钟表一样工作。 –

+4

您需要引入日期时间提供程序接口,该类将会将日期传递给您的类。而为了测试目的,您需要实现该接口的虚拟版本 – zerkms

+0

我实际上已经使用d Timespan值实现了这一点。 例如假设我想让系统时钟为01-May-2012 21:00:00 PM。 当前日期为5月8日11:38:00 PM。当d申请开始时,我得到d差异 DateTime simulateDateTime = '01 -May-2012 21:00:00“; long ticksDifference = DateTime.Now.Subtract; compare d date DateTime currentDateTime = DateTime.Now.Subtract(new TimeSpan(ticksDifference)); 这给了我现在所需要的东西.CurrentDateTime字段的工作方式就像一个时钟,因为DateTime.Now总是改变 &d与时间差的差异给我d准确的模拟时钟 –

回答

1

达到此目的的最简单方法是将系统时钟更改为“测试时间”,运行测试,然后再更换。这很哈克,我不推荐它,但它会工作。

更好的方法是使用一个高于DateTime.Now的抽象,这将允许您注入静态值或操作检索值以进行测试。鉴于您希望测试值“打勾”,而不是保持静态快照,将“TimeSpan”添加到“现在”是最容易的。

所以添加一个名为“偏移”一个应用程序设置,可以解析为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; 
    } 
} 

要运行这个1小时20分钟以后,你只需调整offset

<add key="offset" value="01:20:00" /> 

理想情况下,你需要创建一个接口为DateTime和执行依赖注入,但是你的目的 - 虽然这将是首选 - 我建议,这将打开蠕虫的罐头会为你造成一个混乱的世界。这很简单,并会工作。

+0

我做了类似的事情,谢谢。 –

1

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

+0

感谢您的建议:-) –

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]; 
    } 
} 

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

+0

谢谢你的建议 –