【问题标题】:Generate a random number of Addresses each with a unique Type-value with Bogus Faker使用 Bogus Faker 生成随机数量的地址,每个地址都具有唯一的类型值
【发布时间】:2020-05-24 23:26:11
【问题描述】:

我使用 Bogus https://github.com/bchavez/Bogus/ 生成测试数据。

我有一个具有属性的人对象:

  • 名字,
  • 姓氏
  • 地址(列表)

地址对象具有属性:

  • 街道地址,
  • 邮政编码,
  • 城市
  • 地址类型,

AddressType 有枚举:{ "work", "home", "SPAR" }

我想亲自创建一个随机数的地址,介于 0 和 AddressType 中的值数之间,在本例中为 3。每个创建的地址都应该有一个唯一的 AddressType-value。

到目前为止我所尝试的:

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-value,因此不排除重复。

如何解决这个问题以保存以前使用的 AddressType-values 的状态,以便只有唯一的 AddressType-values?

附注。不必在调用 '''GetAddresses(p).Generate(faker.Random.Number(3))) // 从 0 到 3'''

中硬性化 AddressType-values (3) 的数量>

是否可以提供一个计算 AddressType 枚举数的表达式?

【问题讨论】:

    标签: c# .net faker bogus


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2012-05-03
      • 2021-07-08
      • 2017-10-02
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      相关资源
      最近更新 更多