Utiliser la valeur d'une propriété parent lors de la création d'un enfant complexe AutoFixture

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

  •  27-10-2019
  •  | 
  •  

Question

J'utilise AutoFixture pour générer des données pour une structure impliquant un objet parent et les objets enfants complexes, comme ceci:

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

Y at-il un moyen de régler automatiquement la ParentId de propriété de l'objet Child généré à l'identifiant attribué au parent? En ce moment, mon apparence solution comme celle-ci, ce qui est pas très jolie:

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

Il se sent comme il y a une meilleure façon de le faire que je suis absent? Je regardais dans la création d'un ISpecimenBuilder personnalisé, mais n'a pas réussi à résoudre cette façon non plus.

Était-ce utile?

La solution

AutoFixture est basé sur un ensemble de règles et d'hypothèses sur l'API, il peut être demandé de travailler avec. Considérez qu'il a été créé et compilé sans aucune connaissance préalable des classes Child et Parent, ou tout autre type dans une API donnée. Tout ce qu'il doit travailler avec l'API publique.

Pensez à AutoFixture en tant que programmeur très faible qui ne comprend même pas votre langue (même pas l'anglais). Plus indéréglable vous pouvez rendre votre API, plus il sera facile d'utiliser AutoFixture avec.

Le problème avec des références circulaires comme la relation parent / enfant décrit ici est qu'il casse l'encapsulation. Vous devrez créer au moins une des instances de classe d'abord dans un état non valide. Qu'il est difficile de faire fonctionner AutoFixture avec une telle API devrait surtout être considérée comme un signe d'avertissement que l'API peut bénéficier de refactoring.

En outre, les lignes directrices de conception .NET Framework recommande contre l'exposition des tableaux en tant que propriétés - propriétés particulièrement inscriptibles. Ainsi, avec un design mieux encapsulé, l'API peut être beaucoup plus facile de travailler avec, à la fois pour AutoFixture et vous et vos collègues.

Compte tenu de l'API ci-dessus, je ne vois aucune façon cela peut être beaucoup plus facile de travailler avec. Considérez comment supprimer la référence circulaire et faire des propriétés collection en lecture seule, et il sera beaucoup plus facile.

Pour mémoire, je n'ai pas écrit une API avec une référence circulaire pendant des années, il est donc tout à fait possible d'éviter les parents / relations enfants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top