【问题标题】:How to combine a Convention-based Customization with AutoFixture's [AutoData] attribute?如何将基于约定的自定义与 AutoFixture 的 [AutoData] 属性相结合?
【发布时间】:2016-08-01 16:00:53
【问题描述】:

我正在使用AutoFixture[AutoData] 属性为一些单元测试(NUnit)提供一个POCO 实例。例如:

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

【问题讨论】:

  • 正如我在Twitter conversation 中也提到的,适当的反应是将属性的类型从string 更改为Uri,从而避免Primitive Obsession。在那次谈话中,你还暗示这不适用于这种情况,但由于这对于这篇文章的普通读者来说并不明显,所以我添加了这条评论。

标签: c# unit-testing autofixture


【解决方案1】:

您应该定义自己的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

【讨论】:

    【解决方案2】:

    您还可以覆盖 CustomizeAttribute 以达到类似

    的语法
    [Test, AutoData]
    public void Create_NameIsNull_ThrowsException(
      [MyPOCOWithValidUrl] MyPOCO myPOCO) 
    {..}
    

    Some real world examples

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2021-05-13
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多