2008-10-07 47 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是顺序的,那么顺序生成它们,不随机)。