我想模擬日期時間。假設我有要執行的動作列表,並且每個動作都有一個日期時間字段。當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準確的模擬時鐘 –