Cuando se introdujeron por primera vez, mucha gente confundió fácilmente objetos de imitación con la noción común de
usar stubs. Desde entonces parece que la gente tiene mejor compresión de las diferencias (y espero que la anterior versión
de este ensayo ayudase). Sin embargo para comprender complétamente la manera en que la gente usa imitaciones es
imporante entender imitaciones y otros tipos de dobles (¿Dobles?, No te preocupes si este es un término nuevo para ti,
espera unos cuantos párrafos y todo estará claro.)
Cuando estas haciendo tests como estos, te estas centrando en un elemento del software cada vez, de aquí el común nombre
de pruebas unitarias (unit testing). El problema es que para construir una simple unidad de trabajo, a menudo necesitas otras
unidades, de aquí la necesidad de algún tipo de almacén en nuestro ejemplo.
En los dos estilos de tests que he enseñado arriba, el primer caso usa un objeto almacén real y el segundo usa un almacén de
imitación. Usar imitaciones es una forma de no usar un almacén real en el test pero hay otras formas de objetos irreales para
tests como estos.
El vocabulario para hablar de esto se vuelve farragoso pronto, todo tipo de palabras son usadas: stub, mock, fake (falso),
dummy. Para éste artículo voy a seguir el vocabulario del libro de Gerard Meszaros. No es lo que todo el mundo usa pero
pienso que es un buen vocabulario y puesto que este es mi ensayo puedo elegir las palabras que uso.
Meszaros usa el término Doble de Test como el genérico para cualquier tipo de objeto que se hace pasar por otro real para
propósitos de pruebas. El nombre viene de la noción del doble de los actores en las películas. (Uno de sus propósitos fue
evitar usar cualquier nombre que fuese ámpliamente usado)
Meszaros entonces definió cuatro tipos de doble en particular:
* Objetos dummy: se pasan como argumento pero nunca se usan realmente. Normalmente se usan sólo para rellenar listas
de parámetros.
* Objetos fake: tienen implementaciones que realmente funcionan pero normalmente toman algún atajo o cortocircuito
que les hace inapropiados para producción (como base de datos en memoria por ejemplo)
* Los stubs (stubs) proporcionan respuestas enlatadas a llamadas hechas durante los tests normalmente sin responder en
absoluto a cualquier otra cosa fuera de aquello para lo que han sido programados. Los stubs pueden también grabar
información sobre las llamadas tal como una pasarela de email que recuerda qué mensajes envió o quizás sólo cómo se
enviaron los mensajes.
* Las imitaciones (mocks) son de lo que estamos hablando aquí: objetos preprogramados con expectativas que conforman
la especificación de cómo se espera que se reciban las llamadas.
De estos tipos de dobles, sólo las imitaciones insisten en la verificación de comportamiento. Los otros dobles pueden, y
normalmente sí que usan verificación del estado. Las imitaciones realmente se comportan como los otros dobles durante la
fase de ejecución, cuando necesitan hacer creer al SUT que está hablando con su colaborador real, pero difieren en las fases
de configuración y verificación.
Para explorar los dobles de test un poco más, necesitamos extender nuestro ejemplo. Mucha gente sólo usa el doble de
test ,si con el objeto real, es dificultoso trabajar. Un caso más común de doble de test sería que dijésemos que queremos
enviar un email en caso que rellenar el pedido falle. El problema es que no queremos enviar emails reales a nuestros clientes
durante los tests. En su lugar creamos un doble de test para nuestro sistema de email, uno que podamos controlar y
manipular.
Aquí podemos empezar a ver la diferencia entre imitaciones y stubs. Si estuviéramos escribiendo un test para este
sistema de correo, podríamos escribir un stub simple tal que así: