Mit AutoFixture 3.50 und xUnit.NET scheint es, dass es einen Unterschied zwischen der Art und Weise, wie AutoData-Theorie Tests konkrete Objekte erstellen, Fixture.Create()
schafft konkrete Objekte erstellt.AutoDataAttribute die konkrete Objekt Erstellungslogik ruft alle Eigenschaft Getter einmal
Einfaches Beispiel:
public class Foo
{
private string prop;
public string Prop
{
get
{
if (prop == null) { prop = "Prop"; } // Breakpoint 'A'
return prop;
}
}
}
-Test Fixture
mit:
[Fact]
public void FixtureTest()
{
var fixture = new Fixture();
var result = fixture.Create<Foo>(); // Breakpoint 'B1'
}
Test AutoDataAttribute
:
[Theory, AutoData]
public void AutoDataTest(Foo sut)
{
var bar = 1; // Essential no-op, Breakpoint 'B2'
}
Im ersten Test wird der Breakpoint 'B1' getroffen, während der Breakpoint 'A' niemals getroffen wird. Im letzteren Test wird der Haltepunkt 'A' getroffen, bevor der Haltepunkt 'B2' getroffen wird. Dies ist problematisch, wenn ich die Eigenschaft "träge" initialisiert habe, die der obigen nicht unähnlich ist - weil das Hintergrundfeld der Eigenschaft initialisiert wird, bevor der Test ausgeführt wird, kann ich die Initialisierungslogik nicht testen.
Gibt es eine Möglichkeit, AutoDataAttribute
anzupassen, so dass ich dieses Verhalten umgehen kann? Oder vielleicht, vielleicht ist das ein Fehler?
Danke für die detaillierte Antwort! – MrPiao