C#库用随机数据填充对象

Ale*_*sev 48 c#

我想用随机数据填充我的对象(用于测试目的),是否有一个库可以做到这一点?

某种反射方法,它将遍历对象图并初始化原始属性,如(string,int,DateTime等)(但深入的方式,包括集合,子对象等)

Bri*_*vez 42

虚假

Bogus是一个简单而健全的C#和.NET假数据生成器.Faker.js的 AC#port,受FluentValidation语法糖的启发.支持.NET Core.

建立

public enum Gender
{
   Male,
   Female
}

var userIds = 0;

var testUsers = new Faker<User>()
    //Optional: Call for objects that have complex initialization
    .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####")))

    //Basic rules using built-in generators
    .RuleFor(u => u.FirstName, f => f.Name.FirstName())
    .RuleFor(u => u.LastName, f => f.Name.LastName())
    .RuleFor(u => u.Avatar, f => f.Internet.Avatar())
    .RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName))
    .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName))
    //Use an enum outside scope.
    .RuleFor(u => u.Gender, f => f.PickRandom<Gender>())
    //Use a method outside scope.
    .RuleFor(u => u.CartId, f => Guid.NewGuid());
Run Code Online (Sandbox Code Playgroud)

生成

var user = testUsers.Generate();
Console.WriteLine(user.DumpAsJson());

/* OUTPUT:
{
  "Id": 0,
  "FirstName": "Audrey",
  "LastName": "Spencer",
  "FullName": "Audrey Spencer",
  "UserName": "Audrey_Spencer72",
  "Email": "Audrey82@gmail.com",
  "Avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/itstotallyamy/128.jpg",
  "Gender": 0,
  "CartId": "863f9462-5b88-471f-b833-991d68db8c93", ....
Run Code Online (Sandbox Code Playgroud)

没有流畅的语法

  public void Without_Fluent_Syntax()
  {
      var random = new Bogus.Randomizer();
      var lorem = new Bogus.DataSets.Lorem();
      var o = new Order()
          {
              OrderId = random.Number(1, 100),
              Item = lorem.Sentence(),
              Quantity = random.Number(1, 10)
          };
      o.Dump();
  }
  /* OUTPUT:
  {
    "OrderId": 61,
    "Item": "vel est ipsa",
    "Quantity": 7
  } */
Run Code Online (Sandbox Code Playgroud)

  • 我找不到一种简单的方法来创建填充对象而不为每个属性创建规则。AutoFixture 最适合我 (6认同)
  • @Vdex AutoBogus 无需为每个属性指定规则即可填充对象:https://www.nuget.org/packages/AutoBogus/ (3认同)

Yuc*_*uck 26

NBuilder是一个非常好的用于生成数据的流畅API库.它使用您定义的规则,而不是"随机"本身.但是,您可以将输入随机化到API,以满足您的需求.

由于这仍然得到一些关注,我认为值得一提的是该项目现在也可以通过NuGet(https://www.nuget.org/packages/NBuilder/)获得,尽管它自2011年以来一直没有被修改过.


Max*_*eev 13

我尝试过AutoFixture(https://github.com/AutoFixture/AutoFixture),它对我很有用.它可以在一行代码中轻松生成具有深层次子层次的对象.


JCi*_*sar 7

我最近一直在研究一个与你所描述的完全相同的东西(也许它之前已经完成过,但这似乎是一个有趣的项目).它仍在进行中,但我认为它捕获了您提到的所有功能.你可以在这里找到Nuget包:

https://www.nuget.org/packages/randomtestvalues

这里的存储库:https://github.com/RasicN/random-test-values

我希望你喜欢它.

示例代码:

var randomMyClass = RandomValue.Object<MyClass>();