Как использовать AutoBogus/Bogus для генерации постоянного значения свойства на основе его типа?

Я пытаюсь создать объекты класса, при этом его значение должно отражать его тип.

Например, если тип его свойства — строка, то значение этого свойства должно быть «строка», а если это целое число, оно должно иметь максимальное целочисленное значение. Пока это то, что у меня есть:

        var personFaker = new AutoFaker<Person>()
            .RuleFor(o => o.Id, 9223372036854775807); //Id is of type long
            .RuleFor(o => o.Name, "string")
            .RuleFor(o => o.Age, 2147483647); //Age is of type integer
        var bookFaker = new AutoFaker<Book>()
            .RuleFor(o => o.Id, 9223372036854775807); //Id is of type long
            .RuleFor(o => o.Title, "string")
            .RuleFor(o => o.Author, "string")
            .RuleFor(o => o.Pages, 2147483647) //Pages is of type integer
....

Проблема с этим подходом заключается в том, что мне пришлось бы перечислять .RuleFor для каждого свойства этого класса. Это утомительно и негибко.

Мне интересно, есть ли глобальная конфигурация, чтобы указать, какие значения должны быть сгенерированы в AutoFaker или Bogus на основе типа свойства. Например, для всех свойств типа string его генерируемое значение можно настроить так, чтобы оно задавало слово «строка».

🤔 А знаете ли вы, что...
C# имеет возможность перегрузки операторов для пользовательских типов данных.


45
1

Ответ:

Решено

Используя только Bogus:

using Bogus;

void Main()
{
   var userFaker = new Faker<User>()
      .RuleForType(typeof(string), f => "this_is_a_string")
      .RuleForType(typeof(int), f => int.MaxValue)
      .RuleFor(u => u.Weight, f => f.Random.Double(100, 200));

   userFaker.Generate(3).Dump();
}

public class User
{
   public string Name;
   public int Age;
   public string Hobby;
   public double Weight;
}

results


Вы можете пойти дальше и инкапсулировать эти правила «по умолчанию», производные от Faker<T> следующим образом:

public class MyDefaultFaker<T> : Faker<T> where T : class
{
   public MyDefaultFaker()
   {
      this.RuleForType(typeof(string), f => "default_is_string");
      this.RuleForType(typeof(int), f => int.MaxValue);
   }
}

И ваш пример становится:

void Main()
{
   var userFaker = new MyDefaultFaker<User>()
      .RuleFor(u => u.Weight, f => f.Random.Double(100, 200));

   var bookFaker = new MyDefaultFaker<Book>();

   userFaker.Generate(3).Dump();
   bookFaker.Generate(3).Dump();
}

results2