2016-08-01 15 views
2

Ich verwende AutoFixture 's [AutoData] Attribut, um einige Komponententests (NUnit) mit einer Instanz eines POCO bereitzustellen. Zum Beispiel:Wie wird eine Convention-basierte Anpassung mit dem Attribut [AutoData] von AutoFixture kombiniert?

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

Ich habe hinzugefügt vor kurzem eine neue String-Eigenschaft meiner POCO, die immer eine richtig gebildet URL enthalten.

Natürlich ist [AutoData] diese Anforderung nicht bekannt und generiert den üblichen GUID-basierten Zeichenfolgenwert für diese Eigenschaft. Dies führt dazu, dass meine Tests fehlschlagen (wegen einer gewissen Validierung, die ich an Stelle habe).

Ich habe den Rat von @ploeh befolgt und eine Convention-based Customization für AutoFixture geschrieben, die speziell eine richtig formatierte URL-Zeichenfolge für diese neue Eigenschaft von mir generiert. Es ist eine Klasse namens UrlSpecimenBuilder, die ISpecimenProvider implementiert.

Meine Frage ist, wie kann ich meine neue ISpecimenProvider mit [AutoData] kombinieren?

Ich möchte nicht fixture.Customizations.Add(new UrlSpecimenBuilder()); in jedem meiner Komponententest gehen müssen. Ich bin auf der Suche nach einem einzelnen Test Fixture Setup-Schritt, der das gleiche tun wird.

+2

Wie ich auch in unserer [Twitter-Konversation] (https://twitter.com/urig/status/760085204971163649) erwähnt habe, wäre die geeignete Reaktion, den Typ der Eigenschaft von 'string' in' Uri' zu ändern, Vermeiden Sie so [Primitive Obsession] (http://blog.ploeh.dk/2011/05/25/DesignSmellPrimitiveObsession). In diesem Gespräch haben Sie auch angedeutet, dass dies in diesem Fall nicht anwendbar ist, aber da dies für einen zufälligen Leser dieses Beitrags nicht ersichtlich ist, habe ich diesen Kommentar hinzugefügt. –

Antwort

4

Sie sollten Ihre eigene Version des AutoDataAttribute definieren und alle Anpassungen anwenden, die Sie benötigen. Wenn die Anpassung relevant für alle Tests sind, könnte es DefaultAutoData genannt werden:

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

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

Siehe this Mark Seemann post für weitere Einzelheiten.