簡體   English   中英

單元測試基於時間的組件?

[英]Unit testing a time - based component?

所以我正在編寫一個緩存系統(不是太復雜,但它有非常好的語義)和ttl(生存時間)的項目。

當然ttl必須經過單元測試,但由於無法在C#中注入“IDateTime”或“ITimeSpan”的新實現(因為沒有這樣的東西),你會怎么做呢?

首先寫一個新的組件“IDateTimeProvider”和“DateTimeProvider”,然后哪個可以模擬?

是不是重新實現了.NET運行時庫的一部分......難以理解?

編輯:謝謝大家的驚人答案! 我現在知道我要做什么了!

我通常使用Ayende解決方案的變

public static class SystemTime
{
    public static Func<DateTime> DateProvider = () => DateTime.Now;

    public static DateTime Now { get { return DateProvider(); } }
}

在測試代​​碼中,您現在可以使用SystemTime.Now來獲取當前時間:

var currentTime = SystemTime.Now;

在測試中,您可以將當前時間設置為已知值:

SystemTime.DateProvider = () => new DateTime(2010,6,25);

如何編寫IDateTimeProvider重新實現.Net Framework的部分內容?

你只有兩個實現,一個返回DateTime.Now,另一個返回你之前指定的值。

您可能想看到這個問題:

如何MOQ System.IO.FileInfo類...或沒有接口的任何其他類?

簡而言之,您需要自己創建一個包裝類,或者使用已經為DateTime提供包裝類的庫,如SystemWrapper

IDateTime提供程序可能在其他方面證明是有用的 - 如果要在運行在不同計算機上的客戶端和服務器應用程序之間使用緩存,則兩台計算機(通常是服務器)只需一個時間源,否則時間可能會消失步驟。 我到處使用IDateTimeProvider接口,然后客戶端可以使用從服務器獲取時間的版本。

你會得到的是單元測試的去耦合。

如果您在發明一些模型對象時遇到問題,我認為重新考慮組件的可測試性是很好的。

也許ttl邏輯應該可以自己測試,有點像這樣:

TTLlogic l = new TTLLogic( 10 );
DateTime startdate = now();
Object item=new String();
l.addItem( startdate, item );

l.setTime( startdate.addSeconds( 5 ) );
assert( l.items().contains( item ) );

l.setTime( startdate.addSeconds( 10 ) );
assert( l.items().empty() );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM