Поддельные ложные данные: условные и случайные в одном поле, возможно, оставив пустые ложные данные - PullRequest
1 голос
/ 29 апреля 2019

Используя репозиторий .net Bogus github для заполнения базы данных, я хотел бы заполнить поле случайным образом что-то вроде:

{"Мать", "Сестра", "Брат", "Отец"."," Дядя "," Племянница "," Племянник "," Двоюродный брат "}

Но также случайно оставляют случайные нули тоже?

Я пытался связать их вместе, но это не похожевроде есть синтаксис, который нравится компилятору.

                .RuleFor(u => u.Gender, f => f.PickRandom<Gender>().ToString())
                .RuleFor(u => u.BirthDate, f => f.Date.PastOffset(60,
                    DateTime.Now.AddYears(-18)).Date.ToShortDateString())
                .RuleFor(u => u.FirstName, (f, u) => f.Name.FirstName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.MiddleName, (f, u) => f.Name.FirstName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.LastName, (f, u) => f.Name.LastName(ReturnGenderType(u.Gender)))
                .RuleFor(u => u.Salutation, (f, u) => f.Name.Prefix(ReturnGenderType(u.Gender)))

 private static Bogus.DataSets.Name.Gender ReturnGenderType(string genderString)
        {
            if (genderString == "Male")
            {
                return Bogus.DataSets.Name.Gender.Male;
            }
            else
            {
                return Bogus.DataSets.Name.Gender.Female;
            }
        }

В этом примере похоже, что это может быть расширение, так как тип Gender возвращает позже в здравом уме, а потом случайные имена.

1 Ответ

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

Если вы хотите, чтобы Bogus генерировал "иногда нулевые" значения в правилах, вы можете использовать удобный метод расширения .OrNull().В следующем примере показано, как сгенерировать пустые значения с вероятностью 20%:

void Main()
{
   var userFaker = new Faker<User>()
            .RuleFor( u => u.FirstName, f => f.Name.FirstName())
            .RuleFor( u => u.LastName, f => f.Name.LastName().OrNull(f, .2f) );

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

public class User{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

Также можно удалить вспомогательный метод ReturnGenderType и использоватьвместо этого f => f.Person свойство.Подводя итог, вот как ваш код очищается:

void Main()
{
   var userFaker = new Faker<User>()
    .RuleFor(u => u.Gender,     f => f.Person.Gender.ToString())
    .RuleFor(u => u.BirthDate,  f => f.Date.PastOffset(60, DateTime.Now.AddYears(-18)).Date.ToShortDateString())
    .RuleFor(u => u.FirstName,  f => f.Person.FirstName)
    .RuleFor(u => u.MiddleName, f => f.Name.FirstName(f.Person.Gender).OrNull(f, .2f))
    .RuleFor(u => u.LastName,   f => f.Person.LastName)
    .RuleFor(u => u.Salutation, f => f.Name.Prefix(f.Person.Gender));

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

public class User
{
   public string Gender { get; set; }
   public string BirthDate { get; set; }
   public string FirstName { get; set; }
   public string MiddleName { get; set; }
   public string LastName { get; set; }
   public string Salutation { get; set; }
}

Кстати, Приветствие , сгенерированное f.Name.Prefix(Gender) иногда неверен, потому что префиксы пола не разделены в en локали.Если это проблема, вы можете расширить Bogus чуть-чуть с помощью метода расширения, который исправит вашу локаль:

public static class MyExtensionsForBogus{
   public static string Prefix2(this Bogus.DataSets.Name name, Gender gender)
   {
      if (gender == Gender.Male)
      {
         return name.Random.ArrayElement(new[] { "Mr.", "Dr." });
      }
      return name.Random.ArrayElement(new[]{"Miss", "Ms.", "Mrs."});
   }
}

Затем новое правило Salutation становится:

    .RuleFor(u => u.Salutation, f => f.Name.Prefix2(f.Person.Gender));

И теперь у вас есть несколько приятных на вид данных:

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

...