¿Qué es Object Mocking y cuándo lo necesito?

Muchas personas usan Objetos Simulados cuando están escribiendo pruebas unitarias. ¿Qué es un objeto falso ? ¿Por qué alguna vez necesitaría uno? ¿Necesito un Framework de objeto falso?

La burla de objetos se usa para mantener las dependencias fuera de la prueba de su unidad. Algunas veces tendrá una prueba como “SelectPerson” que seleccionará a una persona de la base de datos y devolverá un objeto Person.

Para hacer esto, normalmente necesitaría una dependencia en la base de datos; sin embargo, con simulación de objetos puede simular la interacción con la base de datos con un marco simulado, por lo que podría devolver un conjunto de datos similar a uno devuelto de la base de datos. su código para garantizar que maneja la traducción de un conjunto de datos a un objeto persona, en lugar de utilizarlo para probar que existe una conexión a la base de datos.

Varias personas ya han respondido el ‘qué’, pero aquí hay un par de ‘por qué’ rápidos que puedo pensar:

  1. Actuación

    Debido a que las pruebas unitarias deben ser rápidas, probar un componente que interactúa con una red, una base de datos u otro recurso de uso intensivo de tiempo no necesita pagar la penalización si se hace usando objetos simulados. Los ahorros se sumn rápidamente.

  2. Colaboración

    Si está escribiendo una pieza de código encapsulada que necesita interactuar con el código de otra persona (que aún no se ha escrito, o se está desarrollando en paralelo, un escenario común), puede ejercitar su código con objetos simulados una vez la interfaz ha sido acordada. De lo contrario, es posible que su código no comience a probarse hasta que el otro componente haya finalizado.

Un objeto simulado le permite realizar pruebas en contra de lo que está escribiendo y detalles abstractos, como acceder a un recurso (disco, servicio de red, etc.). El simulacro luego te permite pretender ser ese recurso externo, o clase o lo que sea.

Realmente no necesita un framework de objetos simulados, simplemente extienda la clase de la funcionalidad de la que no quiere preocuparse en su prueba y asegúrese de que la clase que está probando pueda usar su simulacro en lugar de la real (páselo a través de un constructor o instalador o algo así.

La práctica mostrará cuándo los simulacros son útiles y cuándo no.

EDITAR: los recursos de burla son especialmente importantes para que no tenga que confiar en que existan durante la prueba, y puede burlarse de los detalles de cómo existen y qué responden (como la simulación de una excepción FileNotFoundException o un servicio web que falta , o varios posibles valores de retorno de un servicio web) … todo sin los tiempos de acceso lentos involucrados (la burla demostrará MUCHO más rápido que el acceso a dichos recursos en la prueba).

¿Necesito un Framework de objeto falso?

Ciertamente no. A veces, escribir burlas a mano puede ser bastante tedioso. Pero para cosas simples, no está nada mal. Aplicando el principio del Último Momento Responsable a los marcos de burla, solo debe cambiar de simulacros escritos a mano a un marco cuando haya demostrado que los burla de escritura a mano es más problemático de lo que vale.

Si está empezando con la burla, saltar directamente a un marco va a duplicar al menos su curva de aprendizaje (¿puede doblar una curva?). Los marcos burlones tendrán mucho más sentido cuando hayas gastado algunos proyectos escribiendo burlas a mano.

La burla de objetos es una forma de crear un objeto “virtual” o burlado desde una interfaz, clase abstracta o clase con métodos virtuales. Le permite ordenar uno de estos en su propia definición para propósitos de prueba. Es útil para hacer un objeto que se confía para cierto bloque de código que está probando.

Uno popular que me gusta usar se llama Moq , pero hay muchos otros como RhinoMock y muchos que no conozco.

Le permite probar cómo una parte de su proyecto interactúa con el rest, sin construir todo y potencialmente perder una parte vital.

EDITAR: Gran ejemplo de wikipedia: le permite probar el código de antemano, al igual que un diseñador de automóviles utiliza un simulador de prueba de choque para probar el comportamiento de un automóvil durante un accidente.

Otro uso es que le permitirá probar contra otras partes de su sistema que aún no están construidas. Por ejemplo, si su clase depende de alguna otra clase que sea parte de una función en la que esté trabajando otra persona, puede simplemente solicitar una interfaz en su mayoría completa, un progtwig para la interfaz y solo burlarse de los detalles como espera que funcionen. Luego, asegúrese de que sus suposiciones acerca de la interfaz sean correctas (ya sea mientras se desarrolla o una vez que se completa la función).

Si un marco mocking es útil o no depende en parte del idioma del código que está escribiendo. Con un lenguaje estático, debe esforzarse más para engañar al comstackdor para que acepte sus objetos simulados como un reemplazo del objeto real. En un lenguaje de tipado dynamic como Python, Ruby o Javascript, generalmente solo puede adjuntar los métodos en objetos o clases arbitrarias y pasarlos como parámetros, de modo que un marco agregaría mucho menos valor.

2 marcos de burlas recomendados para las pruebas de unidad .net son Typemock Isolator y Rhino Mock.

En el siguiente enlace, puede ver una explicación de Typemock sobre por qué necesita un marco de burla para Pruebas unitarias.