2011-03-16 14 views
12

Estaba leyendo an article by Dino Esposito on how to test AsyncConrollers in ASP.NET MVC y allí usa el patrón "Objeto humilde", sin entrar en muchos detalles.¿Qué es el patrón de Objeto humilde y cuándo es útil?

No he tenido mucha suerte buscando en Google tampoco.

Entonces, ¿cuál es el patrón de Objeto humilde? ¿Cuándo sería útil?

+1

Si está buscando cómo implementar un proyecto HO utilizando VS, eche un vistazo a esto. http://stackoverflow.com/a/19121286/1977871 – VivekDev

Respuesta

25

Hay a thorough description at xunitpatterns.com.

Básicamente, extrae toda la lógica en un objeto separado que puede probar fácilmente, y su "Objeto Humilde" se convierte en un envoltorio alrededor de su objeto susceptible de prueba; es solo que el objeto humilde también tiene dependencias en cosas que son difíciles de probar, como servicios asíncronos o clases de GUI. La idea es dejar tan poca lógica real en el objeto humilde que no es necesario probarlo, y por lo tanto no es necesario tratar con la dificultad de probar la dependencia.

5

Por lo general, implementaría este tipo de esto como Interface - entonces puede usar un marco de simulación para stub para probarlo, y un marco IoC para inyectar la implementación correcta en tiempo de ejecución.

He aquí un ejemplo de mi proyecto actual:

public interface IUserInterface 
{ 
    string AskUserWhereToSaveFile(
     string title, 
     FileType defaultFileType, 
     string defaultFileName = null, 
     params FileType[] otherOptions 
    ); 

    string AskUserToSelectFileToLoad(
     string title, 
     FileType defaultFileType, 
     params FileType[] fileTypes 
    ); 

    void ShowError(string title, string details); 
    bool AskUserIfTheyWantToRetryAfter(string errorMessage); 
} 

Mi controlador tiene entonces una dependencia en IUserInterface lugar de una visión concreta, que me permiten reemplazar las interacciones del usuario con un trozo para la prueba.

+0

Si lo entiendo correctamente, generalmente emplea este patrón para código sobre el que no tiene control, por lo que no funcionaría el uso de interfaces. – Freek

+0

@Freek: para eso normalmente lo usaría. Todavía tendría una clase (o clases) implementando la 'Interfaz', pero la codificación de una 'Interfaz' oculta todos los detalles de implementación del consumidor. –

Cuestiones relacionadas