Verwenden Sie den Wert einer übergeordneten Eigenschaft bei der Erstellung eines komplexen Kindes in der Autofixure

StackOverflow https://stackoverflow.com/questions/7319984

  •  27-10-2019
  •  | 
  •  

Frage

Ich verwende Autofixure, um Daten für eine Struktur zu generieren, an der ein übergeordnetes Objekt und komplexe untergeordnete Objekte wie folgt beteiligt sind:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Child[] Children { get; set; }
}

public class Child
{
    public string Name { get; set; }
    public int ParentId { get; set; }
}

Gibt es eine Möglichkeit, die Eigenschaft automatisch festzulegen? ParentId des Erzeugten Child Objekt der dem übergeordneten ID zugewiesen? Im Moment sieht meine Lösung so aus, was nicht sehr hübsch ist:

var parent = fixture.Build<Parent>().Without(p => p.Children).CreateAnonymous();
parent.Children = fixture.CreateMany<Child>(10).ToArray();

foreach (var i in parent.Children)
{
    i.ParentId = parent.Id;
}

Es fühlt sich so an, als ob es einen besseren Weg gibt, dies zu tun, den ich vermisse? Ich habe mir einen Brauch erstellen ISpecimenBuilder aber schaffte es auch nicht, es so zu lösen.

War es hilfreich?

Lösung

Die Autofixure basiert auf einer Reihe von Regeln und Annahmen über die API, mit der sie gebeten werden können. Bedenken Sie, dass es ohne Vorkenntnisse der Erstellung und Zusammenstellung des Child und Parent Klassen oder andere Typen in einer bestimmten API. Alles, womit es arbeiten muss, ist die öffentliche API.

Stellen Sie sich Autofixe als einen sehr schwachen Programmierer vor, der Ihre Sprache nicht einmal versteht (nicht einmal Englisch). Je mehr narrensicher Sie können Ihre API erstellen.

Das Problem mit kreisförmigen Referenzen wie der hier beschriebenen Eltern -Kind -Beziehung ist, dass sie die Kapselung durchbricht. Sie müssen anfänglich mindestens eine der Klasseninstanzen in einem ungültigen Zustand erstellen. Dass es schwierig ist, die Autofixure mit einer solchen API zu bearbeiten, sollte hauptsächlich als Warnzeichen angesehen werden, dass die API von der Wiederverarbeitung profitieren könnte.

Darüber hinaus empfiehlt die Richtlinien für .NET -Framework -Design, Arrays als Eigenschaften zu enthüllen - insbesondere zu beschreibbaren Eigenschaften. Bei einem besser eingekapselten Design kann die API sowohl für die Autofixe als auch für sich selbst und Ihre Kollegen viel einfacher zu arbeiten sein.

Angesichts der oben genannten API sehe ich nicht, wie dies viel einfacher zu arbeiten ist. Überlegen Sie, wie Sie die kreisförmige Referenz entfernen und die Sammlungseigenschaften schreibgeschützt machen können, und dies wird viel einfacher sein.

Für die Aufzeichnung habe ich jahrelang keine API mit einer kreisförmigen Referenz nicht mehr geschrieben, daher ist es durchaus möglich, diese Eltern/Kinderbeziehungen zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top