Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 750
urig Avatar asked Aug 01 '16 16:08

urig


2 Answers

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.

like image 177
Serhii Shushliapin Avatar answered Sep 19 '22 14:09

Serhii Shushliapin


You can also override the CustomizeAttribute to arrive at a syntax like

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

Some real world examples

like image 42
Scotty.NET Avatar answered Sep 18 '22 14:09

Scotty.NET