Bogus, AutoFixture, другие (?): Как заполнить вложенную модель поддельными данными и установить правила для определенных свойств?
У меня есть очень вложенная модель, которую я хочу создать тысячи с поддельными данными. Но также некоторые свойства в модели должны находиться в определенном диапазоне или иметь определенные правила. Я посмотрел на эти два ложных генератора данных:
AutoFixture только генерирует поддельные данные для всего.
Bogus может устанавливать правила, такие как диапазоны для свойств, но все остальные свойства остаются нулевыми - или вы должны определить правила для всех них.
Я что-то упустил или невозможно заполнить модели поддельными данными и установить правила только для определенных свойств?
2 ответа
AutoFixture позволяет вам устанавливать правила для свойств, либо в зависимости от свойства, либо по соглашению.
Настроить конкретное свойство
Ты можешь использовать Customize
изменить поведение для определенного типа, включая свойства:
[Fact]
public void CustomizeSpecificProperty()
{
var fixture = new Fixture();
fixture.Customize<MyClass>(c => c.With(mo => mo.Number, 42));
var actual = fixture.Create<MyClass>();
Assert.Equal(42, actual.Number);
}
Эта конкретная настройка меняет правило для всех MyClass.Number
свойства; значение всегда будет ровно 42.
Настроить по соглашению
Вы также можете сопоставить различные свойства по соглашению, часто просматривая комбинацию типа свойства и имени:
[Fact]
public void CustomizeTextPropertyByConvention()
{
var fixture = new Fixture();
fixture.Customizations.Add(new TextPropertyBuilder());
var actual = fixture.Create<MyClass>();
Assert.Equal("Foo", actual.Text);
}
Эта опция также требует, чтобы вы написали TextPropertyBuilder
учебный класс:
public class TextPropertyBuilder : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
var pi = request as PropertyInfo;
if (pi == null || pi.Name != "Text" || pi.PropertyType != typeof(string))
return new NoSpecimen();
return "Foo";
}
}
Это правило будет применяться ко всем string
свойства называются "Text"
независимо от того, в каком классе они определены.
AutoFixture поставляется с богатым API, который позволит вам выразить многие из таких правил в более сжатой форме, но это основные строительные блоки.
Оба приведенных выше примера используют это MyClass
:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}
У Bogus есть расширение сообщества AutoBogus, написанное Ником Доддом, которое позволяет вам автоматически генерировать правила для ваших моделей.
Вы также можете переопределить автоматически сгенерированные правила, созданные AutoBogus, с определенными значениями для определенных тестов. Проверьте readme AutoBogus для получения дополнительной информации.
Кроме того, вам не нужно выбирать один или другой. Вы можете использовать оба. Богус имеет Faker
класс (не Faker<T>
) что вы можете использовать без быстрой настройки и без определения модели T
, Faker
класс даст вам доступ ко всем наборам данных для реалистичной генерации данных. Таким образом, вы можете использовать BogusFaker
объект в сочетании с соглашениями AutoFixture.:)
Надеюсь, это поможет!
Брайан