我想模拟日期时间。假设我有要执行的动作列表,并且每个动作都有一个日期时间字段。当dateTime到来时,应该执行该操作。我可以用DateTime.Now检查日期时间;但是我怎样才能模拟DateTime。我的意思是如果当前时间是下午2点。行动应在下午四点,五点举行。我是否可以使用模拟当前时间到下午4点,并执行第一个操作,并在一小时后执行第二个操作。C#模拟日期时间
感谢,
我想模拟日期时间。假设我有要执行的动作列表,并且每个动作都有一个日期时间字段。当dateTime到来时,应该执行该操作。我可以用DateTime.Now检查日期时间;但是我怎样才能模拟DateTime。我的意思是如果当前时间是下午2点。行动应在下午四点,五点举行。我是否可以使用模拟当前时间到下午4点,并执行第一个操作,并在一小时后执行第二个操作。C#模拟日期时间
感谢,
达到此目的的最简单方法是将系统时钟更改为“测试时间”,运行测试,然后再更换。这很哈克,我不推荐它,但它会工作。
更好的方法是使用一个高于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
和执行依赖注入,但是你的目的 - 虽然这将是首选 - 我建议,这将打开蠕虫的罐头会为你造成一个混乱的世界。这很简单,并会工作。
我做了类似的事情,谢谢。 –
感谢您的建议。:-) –
最简单的办法是注释掉检查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];
}
}
如果您想更具体的(或更好)的回答,请提供一些代码示例。
谢谢你的建议 –
时间应该从下午4点开始继续。即它应该像钟表一样工作。 –
您需要引入日期时间提供程序接口,该类将会将日期传递给您的类。而为了测试目的,您需要实现该接口的虚拟版本 – zerkms
我实际上已经使用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准确的模拟时钟 –