【发布时间】:2021-04-29 15:51:01
【问题描述】:
我正在使用Bogus 生成测试数据,但我有一些字段依赖于另一个对象的部分(我希望为每一代随机选择)但必须彼此保持一致。
这可能不是最好的解释,所以希望这个例子能更好地解释它。
我有一个Order,其中包括来自Customer 的ID 和货币。
public class Customer
{
public Guid Id { get; set; }
public string Currency { get; set; }
}
public class Order
{
public Guid Id { get; set; }
public Guid CustomerId { get; set; } // The ID of a customer
public string Currency { get; set; } // The currency for the customer identified by CustomerId
public decimal Amount { get; set; }
}
我可以使用以下方法产生一些客户:
var customerFaker =
new Faker<Customer>()
.StrictMode(true)
.RuleFor("Id", f => f.Random.Guid())
.RuleFor("Id", f => f.Finance.Currency());
var customers = customerFaker.Generate(10);
但是当涉及到“共享”在订单生成器的规则之间选择的客户时,我遇到了困难:
var orderFaker =
new Faker<Order>()
.StrictMode(true)
.RuleFor("Id", f => f.Random.Guid())
.RuleFor("Amount", f => f.Finance.Amount())
.RuleFor("CustomerId", f => f.PickRandom(customers).Id)
//How do I share the Customer that's been chosen to use it in the rule below?
.RuleFor("Currency", f => f.PickRandom(customers).Currency);
我想出了一些不太理想的方法(比如每次都实例化一个新的 Faker 并传入一个随机客户),但我正在处理非常复杂的对象和依赖项,所以我会如果可能的话,希望避免这种情况。
我目前的想法是,最好的方法可能是扩展 Order 类以便能够存储 Customer,然后再将其转换为订单。考虑到我需要为其执行此操作的模型数量,如果可能的话,我想避免这种情况。
public class OrderWithCustomer : Order
{
public Customer Customer { get; set; }
}
var orderWithCustomerFaker =
new Faker<OrderWithCustomer>()
.StrictMode(true)
.RuleFor("Id", f => f.Random.Guid())
.RuleFor("Amount", f => f.Finance.Amount())
.RuleFor("Customer", f => f.PickRandom(customers))
.RuleFor("CustomerId", (f, o) => o.Customer.Id)
.RuleFor("Currency", (f, o) => o.Customer.Currency);
var orders =
orderWithCustomerFaker
.Generate(10)
.Select(withCustomer => (Order)withCustomer);
【问题讨论】:
-
还有其他方法,它与您所描述的类似,但在
Order类中,您只能引用Customer。CustomerId和Currency将被省略。稍后,当您需要货币或 CustID 时,您只需通过someOrder.Customer.Id或someOrder.Customer.Currency之类的引用访问它们。 -
不幸的是,这是不可能的,因为我正在使用一组我需要遵守的固定模型。
标签: c# testing test-data bogus