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";
}
}
此规则将适用于所有名为 "Text" 的 string 属性,无论它们是在哪个类上定义的。
AutoFixture 带有丰富的 API,可以让您以更简洁的方式表达许多此类规则,但这些是主要的构建块。
以上两个例子都使用了这个MyClass:
public class MyClass
{
public int Number { get; set; }
public string Text { get; set; }
}