繁体   English   中英

如何在 Bogus (C# Faker) 规则之间共享 state?

How can I share state between Bogus (C# Faker) rules?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在使用Bogus生成测试数据,但我有一些字段依赖于另一个 object 的部分(我想为每一代随机选择)但必须彼此一致。

这可能不是最好的解释,所以希望这个例子能更好地解释它。

我有一个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 class 以便能够存储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);
1 个回复

虽然 Bogus 可以很好地生成所有随机数据,但当您需要基于现有关系进行链接时,您不想再次获得随机数据。 相反,在此后期步骤中,您希望select 基于先前分配的现有数据

首先,您将所有customers生成为List<Customer>

var customerFaker = new Faker<Customer>()
    .StrictMode(true)
    .RuleFor("Id", f => f.Random.Guid())
    .RuleFor("Id", f => f.Finance.Currency());

var customers = customerFaker.Generate(10);

您可以直接访问该列表并在所需值内匹配/查找(通过自定义方法或使用 Linq):

using System.Linq; //for linq method, add at the top of file

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)

    //Assuming that you implement your GetById() method or something similar
    .RuleFor("Currency", (f,o) => customers.GetById(o.CustomerId).Currency);

    //Or directly by using linq
    .RuleFor("Currency", (f,o) => customers.First(c => c.Id == o.CustomerId).Currency);

这一切都应该起作用,因为RuleFor()中的第二个参数是一个将值分配给属性的setter 你甚至可以这样做:

var orderFaker = new Faker<Order>()
    .RuleFor("Currency", f => "EUR");
1 我可以在虚假中设置国家/地区吗 (C#)

我刚刚开始在 C# .net 5.0 中使用 Bogus。 我设法在沙盒应用程序中返回非常有用的数据,但我想将数据限制为基于美国。 有没有办法做到这一点? (这是我的沙盒应用程序的一部分) ...

3 如何在C#和Flex之间共享代码?

我正在开发一个与ASP.Net / C#后端通信的Flex / Flash应用程序。 有什么方法可以在两者之间共享代码吗? 服务器提供了一个相当有趣的域模型,客户端设计为maniuplate。 理想情况下,我希望能够定义此域模型一次,并让双方使用它来保持一致性。 我追求DRY带来的所 ...

4 如何在C#和C ++代码之间共享常量?

我正在编写两个进程,一个使用C#和WCF,另一个使用C ++和WWSAPI。 我希望能够在一个地方定义用于两者之间通信的地址,并让C#和C ++都使用它。 这可能吗? 我最接近的是在IDL中定义常量,然后使用MIDL和TLBIMP将其放入可由C#使用的DLL中。 然而,这似乎没有暴露 ...

6 如何在c#中保持项目之间共享的公共代码?

我是c#的新手,我正在试图找到一个很好的解决方案,以便将公共代码保存在几个项目所使用的某个地方。 首先,我尝试将其保存在.cs文件中并将其添加到需要代码的项目中,但这会复制文件,这意味着如果我对公共代码进行任何更改,它将不会反映在使用此代码的各种项目中。 然后我尝试创建一个类库,并使 ...

2010-12-03 13:04:33 5 5541   c#
7 如何在几个C#类之间共享属性

我有几个继承自不同类的类。 所有这些类都有一个会话属性(他们定义或继承)。 我想为所有这些类添加一个属性: 但我不知道怎么做。 我认为在C ++中我可以使用模板,但我没有看到Generics这样做。 怎么做到呢? ...

8 C#:如何在类之间共享类的实例?

我在Windows窗体应用程序中有多个窗体实例,我在加载主窗体时实例化(包括主窗体本身的实例)。 我希望它们在类之间共享,以便我可以在任何位置使用它们。 我还需要通过这些实例使用每个类的成员。 请注意,我很困惑这是如何工作的。 我不知道如何声明我的表单实例,但我只想要一个实例,以便我 ...

9 如何在 2 个 C# 类之间共享字符串

在我的第一堂课上,我有这个代码: 在我的其他班级中,我有以下代码: 错误是“当前上下文中不存在名称‘EmailAddr’”和“当前上下文中不存在名称‘getUser’” ...

10 c#和Java对象的共享业务规则

我有一个拥有Java服务器端对象和C#客户端对象的系统。 可以在系统的两侧修改对象,因此附加了业务规则。 目前的事情是业务规则只存在于服务器端,我真的想避免每次我想验证对象时都要联系服务器。 理想情况下,我希望拥有可以在C#和Java中使用的共享业务规则,因此当需要进行更改时,我只在一 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM