我使用VS2008的目標.NET 2.0框架,以防萬一,我不能改變這一點:)單元測試目的如何改變「今天的日期」?
我有一個DateCalculator
類。其方法GetNextExpirationDate
嘗試確定下一個到期日,內部使用DateTime.Today
作爲基準日期。
當我寫單元測試時,我意識到,我想測試GetNextExpirationDate
不同的「今天」的日期。
這樣做的最好方法是什麼?以下是我考慮過的一些替代方案:
- 公開一個屬性/重載方法,參數爲
baselineDate
,僅在單元測試中使用它。在實際客戶端代碼中,忽略屬性/重載方法而偏向於默認爲baselineDate
至DateTime.Today
的方法。我不願意這樣做,因爲它使DateCalculator類的公共接口很尷尬。 - 創建一個名爲
baselineDate
保護字段在內部設置爲DateTime.Today
。測試時,從DateCalculator
派生DateCalculatorForTesting
,通過構造方法設置baslineDate
。它保持公共接口清潔,但仍然不是很好 -baselineDate
已被保護,並且需要派生類,兩者都僅用於測試。 - 使用擴展方法。我在添加
ExtensionAttribute
後試過,然後意識到它不起作用,因爲擴展方法無法訪問私有/受保護的變量。我最初認爲這確實是一個非常優雅的解決方案。 :(
我會很樂意聽取別人的想法。
好問題...這將是有趣不得不等待,直到一個特定的日期找到你的測試失敗,因爲你依靠什麼「今天」的是,不能增加它:) – slugster 2010-03-20 05:40:42
重複:HTTP: //stackoverflow.com/questions/2425721/unit-testing-datetime-now – 2010-03-20 11:14:04
感謝您的所有輸入。日期時間提供者方法也是我應該考慮的事情。然而,在這種情況下,我認爲我會按照Gishu的方法行事 - 對我來說,這似乎是最少的工作,也是最不具有侵入性的。 – 2010-03-20 22:42:30