使用 Bogus Faker 生成随机数的地址,每个地址都具有唯一的类型值
Generate a random number of Addresses each with a unique Type-value with Bogus Faker
我使用伪造的 https://github.com/bchavez/Bogus/ 来生成测试数据。
我有一个具有属性的 Person 对象:
- 名字,
- 姓氏
- 地址(列表)
地址对象具有属性:
- 街道地址,
- 邮政编码,
- 城市
- 地址类型,
AddressType 有枚举:{ "work", "home", "SPAR" }
我想亲自创建一个随机数的地址,地址数介于 0 和 AddressType 中的值数之间,在本例中为 3。每个创建的地址都应具有唯一的地址类型值。
到目前为止我尝试过的:
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 值?
旁注。不必在调用 '''GetAddresses(p).Generate(faker.Random.Number(3))) // from 0 to 3'''
时硬性规定 AddressType 值 (3) 的数量
是否可以提供一个计算 AddressType 枚举数量的表达式?
我真的不是伪造专家,但在我看来最简单的方法是选择 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;
}
我使用伪造的 https://github.com/bchavez/Bogus/ 来生成测试数据。
我有一个具有属性的 Person 对象:
- 名字,
- 姓氏
- 地址(列表)
地址对象具有属性:
- 街道地址,
- 邮政编码,
- 城市
- 地址类型,
AddressType 有枚举:{ "work", "home", "SPAR" }
我想亲自创建一个随机数的地址,地址数介于 0 和 AddressType 中的值数之间,在本例中为 3。每个创建的地址都应具有唯一的地址类型值。
到目前为止我尝试过的:
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 值?
旁注。不必在调用 '''GetAddresses(p).Generate(faker.Random.Number(3))) // from 0 to 3'''
时硬性规定 AddressType 值 (3) 的数量是否可以提供一个计算 AddressType 枚举数量的表达式?
我真的不是伪造专家,但在我看来最简单的方法是选择 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;
}