Я пытаюсь создать объекты класса, при этом его значение должно отражать его тип.
Например, если тип его свойства — строка, то значение этого свойства должно быть «строка», а если это целое число, оно должно иметь максимальное целочисленное значение. Пока это то, что у меня есть:
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# имеет возможность перегрузки операторов для пользовательских типов данных.
Используя только 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;
}
Вы можете пойти дальше и инкапсулировать эти правила «по умолчанию», производные от 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();
}