Utilizzare il valore di una proprietà genitore durante la creazione di un figlio complesso AutoFixture

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

  •  27-10-2019
  •  | 
  •  

Domanda

sto usando AutoFixture per generare i dati per una struttura che coinvolgono un oggetto padre e gli oggetti figlio complessi, in questo modo:

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; }
}

C'è un modo per impostare automaticamente la ParentId proprietà dell'oggetto Child generato per l'id assegnato al genitore? In questo momento il mio aspetto soluzione come questa, che non è molto carina:

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;
}

Ci si sente come se ci fosse un modo migliore per fare questo che mi manca? Ho guardato nella creazione di un ISpecimenBuilder personalizzato, ma non sono riuscito a risolvere in questo modo sia.

È stato utile?

Soluzione

AutoFixture si basa su un insieme di regole e ipotesi circa l'API può essere chiesto di lavorare con. Si consideri che è stato creato e compilato senza alcuna conoscenza delle classi Child e Parent, o qualsiasi altro tipo in un determinato API. Tutto ciò che deve lavorare con l'API è pubblica.

Pensate AutoFixture come programmatore molto debole che non sa nemmeno capire la propria lingua (nemmeno inglese). Il più infallibile potete fare la vostra API, tanto più facile sarà quella di utilizzare AutoFixture con esso.

Il problema con i riferimenti circolari, come il rapporto padre / figlio qui descritto è che si rompe l'incapsulamento. È necessario creare almeno una delle istanze di classe inizialmente in uno stato non valido. Che è difficile da rendere il lavoro AutoFixture con un tale API dovrebbe principalmente essere preso come un segnale di avvertimento che l'API potrebbe beneficiare di refactoring.

Inoltre, il .NET Framework design Linee guida sconsiglia di esporre le matrici come proprietà - in particolare le proprietà scrivibili. Così, con un design migliore incapsulato, l'API potrebbe essere molto più facile da lavorare, sia per AutoFixture e voi stessi e ai vostri colleghi.

Dato l'API di cui sopra, non vedo alcun modo questo può essere reso molto più facile da lavorare. Considerare come rimuovere le proprietà di riferimento e di raccolta make circolari di sola lettura, e sarà molto più facile.

Per la cronaca, non ho scritto un API con un riferimento circolare per anni, quindi è abbastanza possibile evitare quelle genitore / i rapporti del bambino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top