我們的單元測試之一是使用隨機數據填充業務對象內的屬性。使用泛型獲取隨機數據
這些性質不同的固有類型,因此我們想使用泛型的力量來回報你沿東西線傳遞類型的數據:
public static T GetData<T>()
,你會如何去接近這個?低級別的界面會起作用嗎? (IConvertible)
我們的單元測試之一是使用隨機數據填充業務對象內的屬性。使用泛型獲取隨機數據
這些性質不同的固有類型,因此我們想使用泛型的力量來回報你沿東西線傳遞類型的數據:
public static T GetData<T>()
,你會如何去接近這個?低級別的界面會起作用嗎? (IConvertible)
這取決於你想要什麼隨機數據,因爲方式或算法要使用完全不同,這取決於類型。
例如:
// 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>();
...
您可以保留「易於使用」的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。
一般來說,我會避免寫隨機單元測試,因爲這不是單元測試的目的。在編寫單元測試時,您確實需要手動生成數據以確保覆蓋您的類/程序中的所有路徑,並且通常在測試中對這些數據進行硬編碼,以便重新運行測試。
所以我想你真的寫煙測試,看看你的軟件如何表現大數據集。在這裏,我認爲你應該像其他人已經建議的那樣,爲每個業務對象類型實現一個特定的生成器 - 以確保數據與您期望的生產數據相當相似(例如,如果ID是順序的,那麼順序生成它們,不隨機)。
我會用AutoPoco來產生測試所需的數據。
有趣的方法。得到了我的投票。 – OregonGhost 2008-10-07 10:14:22
謝謝,我會放棄並回傳我的結果。 – 2008-10-07 10:17:19