简体   繁体   中英

How to combine a Convention-based Customization with AutoFixture's [AutoData] attribute?

I am using AutoFixture 's [AutoData] attribute to provide some unit tests (NUnit) with an instance of a POCO. For example:

[Test, AutoData]
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..}

I've recently added a new string property to my POCO that must always contain a properly formed URL.

Naturally, [AutoData] is not aware of this requirement and generates the usual GUID-based string value for this property. This causes my tests to fail (because of some Data Annotations based validation that I have in place).

I've followed @ploeh's advice and written a Convention-based Customization for AutoFixture that specifically generates a properly formatted URL string for this new property of mine. It is a class called UrlSpecimenBuilder that implements ISpecimenProvider .

My question is, how can I combine my new ISpecimenProvider with [AutoData] ?

I don't want to have to go fixture.Customizations.Add(new UrlSpecimenBuilder()); in each one of my unit test. I'm looking for a single test fixture setup step that will do the same thing.

You should define your own version of the AutoDataAttribute and apply all the customizations you need. If the customizations are relevant for all the tests, it might be called DefaultAutoData :

[Test, DefaultAutoData]
public void Create_NameIsNull_ThrowsException(MyPOCO myPOCO) {..}

internal class DefaultAutoDataAttribute : AutoDataAttribute
{
  public DefaultAutoDataAttribute()
    : base(new Fixture().Customizations.Add(new UrlSpecimenBuilder()))
  {
  }
}

See this Mark Seemann post for details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM