Сгенерируйте случайное количество адресов с уникальным значением типа с помощью Bogus Faker - PullRequest
0 голосов
/ 09 февраля 2020

Я использую Bogus https://github.com/bchavez/Bogus/ для генерации тестовых данных.

У меня есть Person-объект со свойствами:

  • firstName,
  • lastName
  • адреса (список)

Address-Object имеет свойства:

  • streetAddress,
  • zipCode,
  • city
  • addressType,

AddressType имеет перечисления: {"work", "home", "SPAR"}

Я хотел бы создать случайное число адресов лично между 0 и количеством значений в AddressType, которое в данном случае равно 3. Каждый созданный адрес должен иметь уникальное значение AddressType.

То, что я пробовал до сих пор:

void Main()
{
    var fakePersons = new Faker<Person>(locale)
      .RuleFor(p => p.firstName, f => f.Name.FirstName(f.Person.Gender))
      .RuleFor(p => p.lastName, f => f.Name.LastName(f.Person.Gender))
      .RuleFor(p => p.addresses, (f, p) => GetAddresses(p).Generate(faker.Random.Number(3))) // from 0 to 3
}

private Faker<Address> GetAddresses(Person p)
{
    return new Faker<Address>(locale)
        .RuleFor(a => a.streetAddress, f => f.Address.StreetAddress())
        .RuleFor(a => a.city, f => f.Address.City())
        .RuleFor(a => a.zipCode, f => f.Address.ZipCode())
        .RuleFor(a => a.addressType, f => f.PickRandom<AddressType>())  // <===

}

Это создаст от 0 до 3 адресов лично, где каждый адрес может иметь любой AddressType- значение, так что это не исключает дубликатов.

Как это можно решить, чтобы сохранить состояние ранее использованных значений AddressType, чтобы были только уникальные значения AddressType?

Примечание. Вместо того, чтобы фиксировать число AddressType-values ​​(3) в вызове '' 'GetAddresses (p) .Generate (faker.Random.Number (3))) // от 0 до 3' ''

Можно ли предоставить выражение, которое подсчитывает количество перечислений AddressType?

1 Ответ

0 голосов
/ 09 февраля 2020

Я действительно не специалист по Bogus, но мне кажется, что самый простой подход - выбрать N типов адресов, а затем сгенерировать N адресов без типов и, наконец, установить типы для каждого сгенерированного адреса.

private static readonly AddressType[] AllAddressTypes = Enum.GetValues(typeof(AddressType))
                                                       .Cast<AddressType>()
                                                       .ToArray();

private ICollection<Address> GetRandomAddresses(Faker faker, Person p)
{
    // Select random number of addresses,
    // and the same number of random address types
    var num = faker.Random.Number(AllAddressTypes.Length);
    var types = faker.PickRandom(AllAddressTypes, num).ToArray();


    // Build the addresses, without type
    var addresses = GetAddresses(p).Generate(num);  

    // Set the address type for each new address
    for(var i = 0; i < addresses.Count; ++i) {
        addresses[i].addressType = types[i];
    }   
    return addresses;
}
...