如何为原始类型创建随机数据

时间:2014-03-28 10:16:47

标签: c# .net reflection

我希望创建一些辅助扩展来随机填充一个带有属性的新对象,以便进行自动化测试,特别是我想检查对象是否可以序列化和反序列化为json而不会丢失任何数据(来自公共属性)。我到目前为止所做的测试是:

public void MyTest()
{
    var sut = new MyClass().Populate();
    var sut2 = new MyClass().Populate();
    Assert.AreNotEqual(sut, sut2);  //ensure the Equals method distinguishes
    var serialised = JSonConvert.SerializeObject(sut);
    var result = JSonConvert.DeserializeObjct<MyClass>(serialised);
    Assert.AreEqual(result, sut);  //have we got the same data back
}

与班级

public class MyClass()
{
    public int MyInt{get;set;}
    public bool MyBool{get;set;}
    public Byte MyByte{get;set;}

    public override bool Equals(object obj)
    {
        //todo - needs to check all properties
        return base.Equals(obj);
    }
}

和扩展方法

public static T Populate<T>(this T obj)
{
    Type t = obj.GetType();
    foreach (var prop in t.GetProperties()
    {
        Type pt = prop.GetType();
        if (pt.IsPrimitiveType)
        {
            prop.SetMethod.Invoke(obj, pt.CreateValue());
        }
    }
}
public static object[] CreateValue<T>(this T type)
{
    return new [] {TypeDescriptor.GetConverter(type).ConvertFromString(GetRandomString())};
}
public static object[] CreateValue2<T>(this T type)
{
    return new [] {Activator.CreateInstance(type)};
}

CreateValue方法不起作用,因为创建的字符串不是数字或true / false,而CreateValue2只提供默认值,它始终是相同的。

所以我的问题是如何编写一个通用方法来生成所需基元类型的随机值,而不需要为十几个原始类型的if / else链(或开关)?

我不打算将它扩展到原始类型之外(一旦原语解决,通过递归应该相当简单)

1 个答案:

答案 0 :(得分:0)

也许你应该看看AutoPoco。它已经有一些工厂方法可以让你用随机数据填充对象,也可以添加自己的源来创建这些元素。