You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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();
}

额外说明

  1. 关于Record类型适配:这种方式在生成实例时就直接使用传入值或自动生成的值,不需要后续修改属性,完全符合Record不可变的特性,不需要重新实例化对象。
  2. OrDefault/OrNull的作用:这两个扩展方法主要用于控制Bogus生成过程中是否允许属性为null(比如f.PickRandom<SomeEnum>().OrDefault()),和你当前“外部传入值优先”的场景不匹配,直接用null合并运算符更直接。
  3. 嵌套对象的复用逻辑:如果AThing也需要同样的“传入值优先”逻辑,可以把AThing的生成方法也写成类似的静态方法,然后在Foo的规则中调用:
    .RuleFor(x => x.Thing, f => aThing ?? CreateAThing());
    

内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:47:20