2008-10-07 88 views
2

我們的單元測試之一是使用隨機數據填充業務對象內的屬性。使用泛型獲取隨機數據

這些性質不同的固有類型,因此我們想使用泛型的力量來回報你沿東西線傳遞類型的數據:

public static T GetData<T>() 

,你會如何去接近這個?低級別的界面會起作用嗎? (IConvertible)

回答

1

這取決於你想要什麼隨機數據,因爲方式算法要使用完全不同,這取決於類型。

例如:

// Random int 
Random r = new Random(); 
return r.Next(); 

// Random Guid 
return Guid.NewGuid(); 

... 

所以這顯然使得使用泛型的用戶端一個不錯的semplification的,但它沒有任何價值給你寫的類的方式。你可以使用一個開關條款或字典(如喬恩斯基特建議):

switch(typeof(T)) 
{ 
    case System.Int32: 
     Random r = new Random(); 
     return (T)r.Next(); 
    case System.Guid: 
     return (T)Guid.NewGuid(); 
    ... 

然後當你想到你會使用這個類:

RandomGenerator.GetData<Guid>(); 
... 
16

您可以保留「易於使用」的GetData接口,但內部有一個字典< Type,object>其中每個值都是相關類型的Func < T>。隨後的GetData將有一個實現,如:

public static T GetData<T>() 
{ 
    object factory; 
    if (!factories.TryGet(typeof(T), out factory)) 
    { 
     throw new ArgumentException("No factory for type " + typeof(T).Name); 
    } 
    Func<T> factoryFunc = (Func<T>) factory; 
    return factoryFunc(); 
} 

,那麼你會設立工廠字典靜態初始化,一個代表每種類型你想創建隨機數據。在某些情況下,您可以使用簡單的lambda表達式(例如整數),並且在某些情況下,委託可以指向執行更多工作的方法(例如,用於字符串)。順便說一句,您可能希望將我的StaticRandom類用於線程安全的RNG。

+0

有趣的方法。得到了我的投票。 – OregonGhost 2008-10-07 10:14:22

+0

謝謝,我會放棄並回傳我的結果。 – 2008-10-07 10:17:19

2

一般來說,我會避免寫隨機單元測試,因爲這不是單元測試的目的。在編寫單元測試時,您確實需要手動生成數據以確保覆蓋您的類/程序中的所有路徑,並且通常在測試中對這些數據進行硬編碼,以便重新運行測試。

所以我想你真的寫煙測試,看看你的軟件如何表現大數據集。在這裏,我認爲你應該像其他人已經建議的那樣,爲每個業務對象類型實現一個特定的生成器 - 以確保數據與您期望的生產數據相當相似(例如,如果ID是順序的,那麼順序生成它們,不隨機)。