如何为基本类型创建随机数据

本文关键字:创建 随机 数据 类型 | 更新日期: 2023-09-27 17:54:55

我希望创建一些辅助扩展来随机填充具有自动测试目的属性的新对象,特别是我想检查对象是否可以序列化和反序列化为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方法不工作,因为创建的字符串不是数字,或真/假,CreateValue2只是给出默认值,将始终相同。

所以我的问题是我如何写一个通用的方法,将产生所需的基本类型的随机值没有一个if/else链(或开关)的十几种基本类型?

我不打算将其扩展到基本类型之外(一旦基本类型被解决,通过递归应该相当简单)

如何为基本类型创建随机数据

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