我有一个非常嵌套的模型,要用虚假数据创建数千个。但是,模型中的一些属性需要在特定范围内或具有特定规则。我看过以下两个虚假数据生成器:
AutoFixture似乎只为所有内容生成虚假数据。
Bogus可以为属性设置范围等规则,但所有其他属性仍为空 - 或者您必须为所有属性定义规则。
我错过了什么,还是不可能填充模型以使用虚假数据,并仅为特定属性设置规则?
我有一个非常嵌套的模型,要用虚假数据创建数千个。但是,模型中的一些属性需要在特定范围内或具有特定规则。我看过以下两个虚假数据生成器:
AutoFixture似乎只为所有内容生成虚假数据。
Bogus可以为属性设置范围等规则,但所有其他属性仍为空 - 或者您必须为所有属性定义规则。
我错过了什么,还是不可能填充模型以使用虚假数据,并仅为特定属性设置规则?
你可以使用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";
}
}
此规则适用于所有名为"Text"
的string
属性,无论它们定义在哪个类中。
AutoFixture拥有丰富的API,可以更简洁地表达许多这样的规则,但这些是主要的构建块。
上面两个示例都使用了这个MyClass
:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}
fixture.Create<MyClass>();
,类中的所有其他属性也会有内容吗? - Thypari