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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With