目前我正在編寫一個組件的單元測試,該組件測試日期時間特定。我創建了IDateTimeProvider
接口,它可以直接作爲DateTime.UtcNow
包裝和業務對象使用接口而不是DateTime
。看起來DateTime有點超載,應該分成一個值和一個從操作系統獲取該值的東西。我想知道是否有一個特定的原因,不在.NET中有一個接口(IDateTimeProvider
)(IClock
)?爲什麼在.NET中沒有IDateTimeProvider並且DateTime具有Now getter?
回答
簡而言之:因爲BCL的大部分並不是爲可測性設計的。
在「核心」功能方面,對於隨機數生成也是如此 - 許多與HTTP相關的類更難以僞造:(至少在這種情況下,可以很容易地引入你自己的。時鐘接口
從有利的一面,當Noda Time是可供生產使用,它不僅能提供更好的日期/時間API比BCL - 它會提供更多的測試友好的:)
我們始終如一地使用DateTimeProvider包裝類,如果需要,我們可以在測試上下文中重寫該類包裝類...
http://learn.typemock.com/typemock-isolator/能夠模擬DateTime(和其他mscorlib類型)所以DateTime.Now不再是問題。但缺點是,這可能會導致開發人員設計更糟糕的東西,因爲嘲笑DateTime.Now!沒有問題!
也許使用類似IDateTimeProvider的東西是更好的解決方案。
但是,如果您使用的是第三方庫, DateTime TypeMock-Isolatior可能是一個解決方案/解決方法。
而且微軟研究院的摩爾/支腳是涼的東西:http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate(展示瞭如何用一個委託更換任何.NET方法/屬性 - 例如DateTime.Now ;-))
不良鏈接?無法打開頁面。 – Kimi 2011-11-28 10:23:18
我張貼了這個答案,另一個問題,但如果您正在尋找測試DateTime.Now
的簡單方法,它也適用於此。
我喜歡做的是創建一個公共函數,它返回需要當前日期/時間的類中的DateTime(Func<DateTime>
),並將其設置爲默認返回DateTime.Now。然後,在測試期間,我用一個測試函數覆蓋它,該函數返回我想測試的任何DateTime。
public class MyClass
{
public Func<DateTime> DateTimeNow =() => DateTime.Now;
public void MyMethod()
{
var currentTime = DateTimeNow();
//... do work
}
}
public class MyClassTest
{
public void TestMyMethod()
{
// Arrange
var myClass = new MyClass();
myClass.DateTimeNow =() => new DateTime(1999, 12, 31, 23, 59, 59);
// Act
myClass.MyMethod();
// Assert
// my asserts
}
}
- 1. 在.NET框架中,爲什麼會出現PointF(float)並且沒有「PointD」(double)?
- 2. 爲什麼ASP.NET MVC 2沒有default.aspx並且沒有工作?
- 3. 爲什麼System.String.EndsWith()有一個char重載並且System.String.StartsWith()沒有?
- 4. 爲什麼在datetime模塊中有date.today()但沒有time.now()?
- 5. 爲什麼.NET 4.5中沒有CallerTypeNameAttribute?
- 6. 爲什麼.NET中沒有ArgumentEmptyException?
- 7. 什麼是沒有輸入並且沒有輸出的過程?
- 8. 爲什麼datetime('now')在SQLite中實時返回前2小時?
- 9. 爲什麼這個svg被裁剪並且沒有縮放?
- 10. 爲什麼InputStream和OutputStream實現Closeable並且Socket沒有?
- 11. 爲什麼open()失敗並且errno沒有設置?
- 12. 爲什麼在兩個div之間有差距並且沒有重疊
- 13. 在屬性的getter中爲.Net 2.0調用沒有Func
- 14. 爲什麼按鈕具有動作偵聽器並且命令不在LWUIT中?
- 15. 爲什麼.net項目沒有designer.cs?
- 16. 爲什麼沒有.NET社區過程?
- 17. 爲什麼沒有.NET RuntimePropertyHandle和PropertyInfo.GetPropertyFromHandle?
- 18. 爲什麼DateTime是.Net中的結構?
- 19. 爲什麼loadrunner不能在weblogic中工作,並且沒有任何錯誤
- 20. 爲什麼「每一個?」具有 '?' 「某些」沒有「?」在Clojure中?
- 21. 爲什麼不提升::任何有「getter」?
- 22. 有什麼用getter和setter
- 23. 爲什麼工具欄沒有提升?
- 24. java中的Arith溢出:爲什麼在運行時沒有異常並且沒有編譯器警告?
- 25. 沒有什麼是編輯,而且MFMailComposeViewController
- 26. 從datetime = now()
- 27. 爲什麼你不能從datetime模塊導入now()?
- 28. 爲什麼currentDirectoryPath在IDE下返回不同的結果並且沒有它?
- 29. 爲什麼System.Numerics.BigInteger在Silverlight 4.0中沒有Parse方法,但在.Net 4.0中有?
- 30. babel-loader沒有發生錯誤並且沒有錯誤
不要忘記,System.IO ... – 2011-11-28 16:02:11