para crear nuestros datos de prueba, se utiliza la siguiente variación del patrón Builder (ejemplo simplificado!): Clase¿Cómo generar código basado en otra clase?
muestra:
public class Person
{
public string Name { get; set; }
public string Country { get; set; }
}
El constructor:
public class PersonBuilder
{
private string name;
private string country;
public PersonBuilder()
{
SetDefaultValues();
}
private void SetDefaultValues()
{
name = "TODO";
country = "TODO";
}
public Person Build()
{
return new Person
{
Name = name,
Country = country
};
}
public PersonBuilder WithName(string name)
{
this.name = name;
return this;
}
public PersonBuilder WithCountry(string country)
{
this.country = country;
return this;
}
}
NOTA: La el contexto del ejemplo en sí no es relevante. Lo importante aquí es cómo en el ejemplo, una clase de generador como PersonBuilder se puede generar completamente mirando la clase de entidad (Persona) y aplicando el mismo patrón - ver abajo.
Ahora imagina que la clase de persona tiene 15 propiedades en lugar de 2. Tomaría algunos monos para implementar la clase de constructor, mientras que teóricamente, podría generarse automáticamente desde la clase Persona. Podríamos usar generación de código para configurar rápidamente la clase de constructor y agregar código personalizado más adelante si es necesario.
El proceso de generación de código debería tener en cuenta el contexto (nombre y propiedades de la clase de persona), por lo que la generación simple de código basado en texto o magia regex no se siente aquí. Se prefiere una solución que sea dinámica, no basada en texto y que pueda activarse rápidamente desde el interior del estudio visual.
Estoy buscando la mejor manera de realizar la generación de código para escenarios como este. Reflexión? ¿Cofesor? Plantillas T4? Resharper Live plantillas con macros?
Estoy deseando ver algunas grandes respuestas :)
Ya usamos burlas extensamente en nuestras pruebas unitarias, pero nunca pensé en usar simulaciones para esto :). Creo que sería una gran manera de resolver este problema en particular, pero no la cuestión general, que tiene un alcance más amplio que solo las pruebas. ¡Pero muchas gracias por esta respuesta de todos modos! –