2012-05-09 120 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

謝謝你的建議 –