如何将基于会议的自定义与自动混合的[自动数据]属性结合起来?

时间:2016-08-01 16:00:53

标签: c# unit-testing autofixture

我正在使用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());。我正在寻找一个可以做同样事情的单个测试夹具设置步骤。

2 个答案:

答案 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) 
{..}

Some real world examples