Wie zu verwenden AutoFixture zu bauen, mit individuellen Eigenschaften, während Typ-Anpassungen?
Ich versuche, mit autofixture um ein Objekt zu erstellen, aber es gibt bestimmte Eigenschaften, die ich möchte immer vorgegeben werden (während der rest könnte sein automatisch generierter). Allerdings, wenn ich setup eine Anpassung wird es überschrieben, wenn ich das bauen mit Anpassungen.
void Main()
{
var fixture = new Fixture();
fixture.Customize<Person>(composer => composer.With(p => p.Name, "Ben"));
var person = fixture.Build<Person>()
.With(p => p.DateOfBirth, new DateTime(1900, 1, 1))
.Create();
/* RESULT OF person below
Name null
DateOfBirth 1/1/1900
StreetAddress StreetAddressafd6b86b-376a-4355-9a9c-fbae34731453
State State019e867b-ac5e-418f-805b-a64146bc06bc
*/
}
public class Person
{
public string Name { get; set;}
public DateTime DateOfBirth { get; set;}
public string StreetAddress { get; set;}
public string State { get; set;}
}
Den Name
und DateOfBirth
Eigenschaft Anpassungen nicht in Konflikt, so weiß ich nicht, warum der Name endet als null. Ich würde erwarten, dass Namen Ben
.
Wie ich es bekommen kann, so dass beide Anpassungen angewendet werden (dh. Name = "Ben"
und DateOfBirth = 1/1/1900
)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @DavidOsborne richtig darauf hingewiesen, das Verhalten, das Sie sehen, ist wie entwickelt.
Einen der bessere Ansatz ist zu organisieren, Ihre Anpassungen, die in separaten Klassen und aktivieren Sie Sie dann nach Bedarf von einem bestimmten test-Szenario.
Einer Anpassungs-Objekt implementiert die
ICustomization
interface und seine Aufgabe ist die Konfiguration derFixture
Objekt in einer bestimmten Weise. Hier ist ein Beispiel:Können Sie eine Anpassung auf eine bestimmte
Fixture
mithilfe derCustomize
Methode, zum Beispiel:oder:
Können Sie auch kombinieren Sie mehrere Anpassungen in eine neue, indem Sie auf den
CompositeCustomization
Klasse:an welchem Punkt kann man einfach sagen:
Jedoch im Hinterkopf behalten, dass die Reihenfolge, in der die Anpassungen angewendet werden, auf eine
Fixture
Fragen: der Letzte gewinnt und kann potenziell überschreiben die vorherigen, da @MarkSeemann hingewiesen in den Kommentaren. Auch dies ist durch design.So, während Sie kann kombinieren vorhandene Anpassungen, die Arbeit auf verschiedenen Arten, in diesem speziellen Fall, da beide Anpassungen Gegner den gleichen Typ haben, müssen Sie erstellen eine neue Anpassung zu Kapseln alle Einstellungen für die
Person
Art kombiniert:Als Allgemeine Regel gilt, halten Sie Ihre Anpassungen kleinen und konzentriert können Sie wiederverwenden in verschiedenen tests, die Kombination, die für bestimmte test-Szenarien.
AllPersonsAreNamedBen
gehen Sie zu overrideAllPersonsAreBornIn1900
?Diese sieht aus wie es ist by design:
...aus der
Build()
Methode der Dokumentation.Ich Schätze, dass dies vermutlich nicht die ideale Antwort. Die Dokumentation wird jedoch einen Hinweis geben, wie Sie ankommen könnte bei einer.