Предоставить данные для определенных полей во время выполнения в Bogus - PullRequest
0 голосов
/ 20 мая 2019

В настоящее время я создаю набор поддельных правил данных, используя 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;
}

1 Ответ

1 голос
/ 21 июня 2019

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

Итак, в качестве приблизительного ориентира ...

  • Если ваши графы объектов глубоки и сложны,рассмотрите поддельные объекты с фасадом 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>.

Советы по расставанию ...

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

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

...