如何用虚假代表可空值?

时间:2017-12-27 18:49:48

标签: c# .net bogus

beautiful library为DTO生成随机/伪随机值。

    var fruit = new[] { "apple", "banana", "orange", "strawberry", "kiwi" };

var orderIds = 0;
var testOrders = new Faker<Order>()
    //Ensure all properties have rules. By default, StrictMode is false
    //Set a global policy by using Faker.DefaultStrictMode
    .StrictMode(true)
    //OrderId is deterministic
    .RuleFor(o => o.OrderId, f => orderIds++)
    //Pick some fruit from a basket
    .RuleFor(o => o.Item, f => f.PickRandom(fruit))
    //A random quantity from 1 to 10
    .RuleFor(o => o.Quantity, f => f.Random.Number(1, 10));

为int创建规则很简单:

            .RuleForType(typeof(int), f => f.Random.Number(10, 1000))

我们如何为可空的基元类型创建规则?

例如,如果我们的模型具有可空的整数或可空的deimcals:

public class ObjectWithNullables
{

  public int? mynumber{get;set;}
  public decimal? mydec {get;set;}
}

我们不能像这样构建:

.RuleForType(typeof(int?), f => f.Random.Number(10, 1000))

我们如何代表无效?

2 个答案:

答案 0 :(得分:3)

快速阅读似乎表明,当您尝试为给定类型的所有字段/属性提供单个规则时,您只需要使用RuleForType

我认为您使用RuleForType的问题是您没有传入返回正确类型的lambda。作为第一个参数的类型必须与lambda的返回类型匹配。使用

.RuleForType(typeof(int?), f => (int?)f.Random.Number(10, 1000))

如果您需要某些空值的可能性,请选择一个百分比并偶尔返回null:

.RuleForType(typeof(int?), f => (f.Random.Number(1,10) == 1 ? (int?)null : f.Random.Number(10, 1000)))

答案 1 :(得分:2)

BogusBogus.Extensions命名空间中具有.OrNull() / .OrDefault()扩展方法。

要生成随机null的值,请尝试以下操作:

using Bogus.Extensions;

public class ObjectWithNullables
{
   public int? mynumber{get;set;}
   public decimal? mydec {get;set;}
}

var faker = new Faker<ObjectWithNullables>()
            // Generate null 20% of the time.
            .RuleFor(x=> x.mynumber, f=>f.Random.Number(10,1000).OrNull(f, .2f))
            // Generate null 70% of the time.
            .RuleFor(x=>x.mydec, f => f.Random.Decimal(8, 10).OrNull(f, .7f));

faker.Generate(10).Dump();

sample output

希望有帮助!

谢谢,
布莱恩