我有一个非常嵌套的模型,我想用虚假数据创建成千上万个。但是,模型中的某些属性也必须在特定范围内或具有特定规则。我看了看这两个假数据生成器:
AutoFixture 似乎只为所有内容生成假数据。
伪造的可以设置规则,例如属性范围,但所有其他属性保持为空-或您必须为所有属性定义规则。
我是否错过了某些东西,或者是否无法用假数据填充模型并仅为特定属性设置规则?
最佳答案
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; }
}
关于c# - 伪造,自动修复,其他(?): How to fill a nested model with fake data and set rules for specific properties?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48225677/