PreguntaEn TDD y DDD, ¿cómo maneja las propiedades de solo lectura en falsificaciones?
¿Cómo se maneja sólo lectura campos al crear falsificaciones?
Antecedentes
Estoy en las etapas de iniciación del uso de ASP.Net MVC y estoy usando tienda de deportes de Steven Sanderson y Cena del empollón de Scott Gu como ejemplos. Un pequeño problema que acabo de abordar es cómo trabajar con propiedades de solo lectura cuando realizo falsificaciones. Estoy usando LINQToSQL.
Mi interfaz es:
public interface IPersonRespository
{
Person GetPerson(int id);
}
y mi falsa se convierte en
public class FakePersonRepository
{
public Person GetPerson(int id)
{
return new Person {id="EMP12345", name="John Doe", age=47, ssn=123-45-6789, totalDrWhoEpisodesWatched=42};
}
}
Aquí es mi problema. Los campos id, ssn y totalDrWhoEpisodesWatched son de solo lectura, por lo que el código anterior no funcionará. Sin embargo, no reconozco cómo crear una nueva persona falsa y establecer una propiedad de solo lectura. Estoy seguro de que hay una solución, pero todavía no la he encontrado en mis búsquedas.
Actualización: Herencia + Ocultar propiedad como una posible solución?
Todavía no he decidido una solución firme al problema. No me gusta la idea de modificar mis clases de Dominio con el propósito de crear falsificaciones. Para mí, agregar el marcado a las clases de dominio para hacer pruebas es una forma de acoplamiento adicional: el acoplamiento a la implementación de su prueba. Ahora estoy investigando otra posibilidad, que es crear una clase FakePerson, que hereda de Person, pero oculta las propiedades con nuevas propiedades de lectura y escritura.
public class FakePerson: Person
{
public new int age { get; set; }
public new string ssn { get; set; }
public new int totalDrWhoEpisodesWatched { get; set; }
}
Hasta el momento, esta solución es la forma en que me estoy inclinando. Rompe el Principio de Sustitución de Liskov, sin embargo, eso no me molesta tanto en un proyecto de prueba. Me encantaría escuchar cualquier crítica y/o comentario sobre esto como una solución.
Ganador: Mock Marcos
Moq parece hacer el trabajo. Mi última solución de ocultar la propiedad a través de la herencia funciona, de hecho, sin embargo, al usar Moq, obtengo un conjunto estandarizado de funcionalidad que es más fácil de mantener. Supongo que otros frameworks simulados tienen esta funcionalidad, pero no los he comprobado. Se dice que Moq es más directo para el comienzo de la escritura falsa, que definitivamente estoy en este momento.
¿Por qué se ajusta para que sea de sólo lectura? –
Está configurado como de solo lectura, porque el usuario no del dominio tiene derecho a modificar las propiedades. Podría ser por una serie de razones, pero a menudo, porque la aplicación no tiene derechos para modificar el campo, ya sea porque es un campo de cálculo/generado automáticamente o debido a las políticas de seguridad de la base de datos. – John
Sobre un tema poco relacionado, recomendaría cambiar los nombres de sus propiedades a PascalCase para cumplir con las convenciones de nombres de .NET. http://msdn.microsoft.com/en-us/library/ms229043(loband).aspx –