Utiliser la valeur d'une propriété parent lors de la création d'un enfant complexe AutoFixture
-
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.
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.