Use el valor de una propiedad principal al crear un niño complejo en la autofixtura

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy usando autofixture para generar datos para una estructura que involucra un objeto principal y objetos infantiles complejos, como este:

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

¿Hay alguna forma de configurar automáticamente la propiedad? ParentId del generado Child ¿Objeto a la ID asignada al padre? En este momento mi solución se ve así, que no es muy bonita:

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

¿Se siente como si hay una mejor manera de hacer esto que me estoy perdiendo? Busqué crear una costumbre ISpecimenBuilder Pero tampoco logré resolverlo de esa manera.

¿Fue útil?

Solución

La autofixture se basa en un conjunto de reglas y supuestos sobre la API con la que se le puede pedir que trabaje. Considere que se ha creado y compilado sin ningún conocimiento previo del Child y Parent clases, o cualquier otro tipo en una API dada. Todo lo que tiene que trabajar es la API pública.

Piense en la autofixtura como un programador muy tenue que ni siquiera entiende su idioma (ni siquiera el inglés). Cuanto más infalible Puede hacer su API, más fácil será usar la autofixtura con ella.

El problema con las referencias circulares como la relación padre/niño descrita aquí es que rompe la encapsulación. Deberá crear al menos una de las instancias de clase inicialmente en un estado no válido. Que es difícil hacer que la autofircción funcione con tal API debería tomarse principalmente como una señal de advertencia de que la API podría beneficiarse de la refactorización.

Además, las pautas de diseño del marco .NET recomiendan contra la exposición de matrices como propiedades, particularmente propiedades de escritura. Por lo tanto, con un mejor diseño encapsulado, la API podría ser mucho más fácil de trabajar, tanto para la autoformación como para usted y sus colegas.

Dada la API anterior, no veo de ninguna manera que esto se pueda hacer mucho más fácil trabajar. Considere cómo eliminar la referencia circular y hacer que las propiedades de la recolección solo sean lectores, y será mucho más fácil.

Para el registro, no he escrito una API con una referencia circular durante años, por lo que es muy posible evitar esas relaciones entre padres/hijos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top