Сгенерируйте случайное количество адресов, каждый с уникальным значением типа, с помощью Bogus Faker

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

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

  • имя,
  • фамилия
  • адреса (список)

Адрес-объект имеет свойства:

  • адрес улицы,
  • индекс,
  • город
  • тип адреса,

AddressType имеет перечисления: { "работа", "дом", "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 ответ

Решение

Я действительно не эксперт в области 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;
}
Другие вопросы по тегам