我正在使用AutoFixture的[AutoData]
属性来提供一些POCO实例的单元测试(NUnit)。例如:
[Test, AutoData]
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..}
我最近在我的POCO中添加了一个新的字符串属性,该属性必须始终包含正确形成的URL。
当然,[AutoData]
不知道此要求,并为此属性生成通常的基于GUID的字符串值。这导致我的测试失败(因为我已经进行了一些基于Data Annotations的验证)。
我已经关注了@ ploeh的建议并为AutoFixture写了Convention-based Customization,专门为我的这个新属性生成格式正确的URL字符串。这是一个名为UrlSpecimenBuilder
的类,它实现了ISpecimenProvider
。
我的问题是,如何将新的ISpecimenProvider
与[AutoData]
结合使用?
我不想在每次单元测试中都去fixture.Customizations.Add(new UrlSpecimenBuilder());
。我正在寻找一个可以做同样事情的单个测试夹具设置步骤。
答案 0 :(得分:5)
您应该定义自己的AutoDataAttribute
版本并应用所需的所有自定义项。如果自定义项与所有测试相关,则可能会将其称为DefaultAutoData
:
[Test, DefaultAutoData]
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..}
internal class DefaultAutoDataAttribute : AutoDataAttribute
{
public DefaultAutoDataAttribute()
: base(new Fixture().Customizations.Add(new UrlSpecimenBuilder()))
{
}
}
有关详细信息,请参阅this Mark Seemann post。
答案 1 :(得分:1)
您也可以覆盖CustomizeAttribute
以获得类似
[Test, AutoData]
public void Create_NameIsNull_ThrowsException(
[MyPOCOWithValidUrl] MyPOCO myPOCO)
{..}