Предоставить данные для определенных полей во время выполнения в Bogus
В настоящее время я создаю набор поддельных правил данных, используя Bogus. Они будут использоваться набором поддельных сервисов. Под этим я подразумеваю, что я создаю макет поисковой службы, которая предоставляет поддельные данные обратно.
Для большинства служб введенные критерии поиска должны влиять на выводимые данные (например, если вы ищете службу для организаций, базирующихся в Мексике, поддельные данные должны включать только адреса, расположенные в Мексике). Если вы ищете организации с именами, начинающимися с "Micro*", я хочу иметь возможность использовать эти входные данные, чтобы влиять на то, как создаются данные.
До сих пор я был в состоянии сделать это путем подкласса Faker
и предоставляя свой собственный Generate
метод, который принимает некоторые входные данные. Я могу тогда позвонить Faker.Generate()
метод, разрешите ему предоставить некоторые данные, а затем измените определенные поля, прежде чем передать их обратно.
Этот метод работает до некоторой степени, но он не особенно гибок, и я считаю, что должен быть лучший способ сделать это. Я вставил образец этого обходного пути ниже.
// This shows my current workaround
public static Organization Generate(string searchCode)
{
var organization = Faker.Generate();
organization.Code = searchCode;
return organization;
}
0 ответов
Я думаю, что есть много способов сделать это, но это действительно зависит от вашего сценария. Первое, что вам следует сделать, это рассмотреть, насколько глубокими или сложными являются ваши графы объектов.
Итак, в качестве приблизительного ориентира...
- Если графы ваших объектов глубокие и сложные, рассмотрите возможность подделки объектов с помощью
Faker
фасад. Это означает созданиеstatic
фабричные методы, такие как:
void Main()
{
Search("Micro*").Dump();
}
public Organization Search(string search)
{
return CreateOrganization(code: search);
}
static Organization CreateOrganization(string code = null){
var faker = new Faker();
//setup complicated child dependency graphs here.
//then finally create your parent object below.
return new Organization{
Code = code ?? faker.Company.CompanyName()
};
}
public class Organization
{
public string Code { get; set; }
}
- Если вы создаете объекты типа POCO/DTO, которые не имеют очень большого или сложного графа объектов, то используйте
Faker<T>
тоже должно работать очень хорошо. Например:
void Main()
{
Search("Micro*").Dump();
}
public Organization Search(string code){
var customOrgFaker = Fakers.OrgFaker.RuleFor(x => x.Code, f => code);
return customOrgFaker.Generate();
}
static class Fakers{
public static Faker<Organization> OrgFaker =>
new Faker<Organization>()
.RuleFor(o => o.Code, f => f.Company.CompanyName());
}
Обратите внимание, в Faker<T>
пример выше, я звоню .RuleFor(_ => _.Code, ...)
дважды, но только последний звонок .RuleFor
будет применяться. В этом случае.RuleFor(x => x.Code, f => code)
это последний звонок перед .Generate()
. По сути, это похоже на переопределение значения по умолчанию.RuleFor(o => o.Code, f => f.Company.CompanyName())
настройка в статическом конструкторе Fakers
.
Также обратите внимание, что каждый раз .OrgFaker
доступ к собственности, new Faker<T>
создано. Это хорошо, потому что каждое свойство имеет доступ к.OrgFaker
создает специальный экземпляр Faker<T>
для вашего потребления и настройки.
Если это не сработает для вас и у вас есть только один экземпляр Faker<T>
для работы вы можете использовать Faker<T>.Clone()
метод клонирования Faker<T>
и снова звоните .RuleFor
с расходящимся правилом, не испортив исходный экземпляр Faker<T>
.
Напутственный совет...
В итоге, при использовании любого метода, описанного выше, ваш главный приоритет должен заключаться в том, чтобы ваш код был чистым, ясным и читаемым. Стремитесь найти самые простые и удобные в обслуживании решения.
Надеюсь, это поможет!