.NET中如何为Bogus Faker提供可选实例?
在Bogus中为Record类型实现“传入值优先,无则自动生成”的假实例
你需要的这种“传入参数不为null则使用该值,否则由Bogus自动生成”的逻辑完全可以实现,而且不需要先生成实例再覆盖(完美适配Record的不可变性),直接在Bogus的规则定义中处理即可。
实现方案
核心思路是在RuleFor的规则表达式里,用**null合并运算符(??)**直接判断传入的参数:如果参数不为null就用传入的值,否则调用Bogus的生成器方法生成默认假值。
以下是完整的代码示例:
public static Foo CreateAFoo(int? id = null, string? name = null, AThing? aThing = null) { var fooFaker = new Faker<Foo>() // Id:传入值优先,否则生成1-1000的随机整数 .RuleFor(x => x.Id, f => id ?? f.Random.Int(min: 1, max: 1000)) // Name:传入值优先,否则用Bogus内置的商品名称生成器 .RuleFor(x => x.Name, f => name ?? f.Commerce.ProductName()) // Thing:传入值优先,否则生成AThing的假实例(需提前配置AThing的Faker) .RuleFor(x => x.Thing, f => aThing ?? new Faker<AThing>().Generate()); return fooFaker.Generate(); }
额外说明
- 关于Record类型适配:这种方式在生成实例时就直接使用传入值或自动生成的值,不需要后续修改属性,完全符合Record不可变的特性,不需要重新实例化对象。
OrDefault/OrNull的作用:这两个扩展方法主要用于控制Bogus生成过程中是否允许属性为null(比如f.PickRandom<SomeEnum>().OrDefault()),和你当前“外部传入值优先”的场景不匹配,直接用null合并运算符更直接。- 嵌套对象的复用逻辑:如果
AThing也需要同样的“传入值优先”逻辑,可以把AThing的生成方法也写成类似的静态方法,然后在Foo的规则中调用:.RuleFor(x => x.Thing, f => aThing ?? CreateAThing());
内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL
相关产品推荐
相关产品推荐

