Как представить обнуляемые значения с поддельным?

Есть красивая библиотека, которая генерирует случайные / псевдослучайные значения для 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))

Как мы создаем правила для обнуляемых примитивных типов?

Например, если наша модель имеет обнуляемые целочисленные значения или обнуляемые деимкалы:

public class ObjectWithNullables
{

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

Мы не можем построить так:

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

Как мы представляем обнуляемые?

2 ответа

Решение

Быстрое прочтение указывает на то, что вам нужно только использовать RuleForType когда вы пытаетесь предоставить единое правило для всех полей / свойств данного типа.

Я думаю, что ваша проблема с RuleForType это вы не переходили в лямбду, которая возвращала правильный тип. Тип в качестве первого параметра должен соответствовать возвращаемому типу лямбды. использование

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

Если вам нужна некоторая возможность нулевых значений, выберите процент и иногда возвращайте нулевое значение:

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

Богус имеет .OrNull() / .OrDefault() методы расширения в Bogus.Extensions Пространство имен.

Для генерации случайных значений 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();

образец вывода

Надеюсь, это поможет!

Спасибо,
Брайан

Другие вопросы по тегам