Предоставить данные для определенных полей во время выполнения в 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>.

Напутственный совет...

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

Надеюсь, это поможет!

Другие вопросы по тегам