¿Qué tal?
En mi modelo tengo, digamos, OBJ1 y OBJ2 (No les puse estos nombres, claro jaja) y OBJ1 tiene un mensaje de este estilo:
MensajeOBJ1
[condicion] ifTrue: [OBJ2 metodo: self].
Me gustaría saber cómo puedo con TestCase probar que ese mensaje se manda para un caso en el que la condición se cumple. Y también que no se manda en un caso en el que no se cumpla.
Gracias!
Hola Francisco,
Si querés probar el mensaje de OBJ2, lo que tenés que hacer son tres test:
- Un test que verifique correctamente el funcionamiento del mensaje de OBJ2 independientemente de si hay una condición o no.
- Un test que pruebe MensajeOBJ1 para el caso donde la condición no sea valida, por ende no entra al mensaje del OBJ2.
- Un test que pruebe MensajeOBJ1 para el caso donde la condición sea valida, por ende entra al mensaje del OBJ2.
En todos los casos lo haces haciendo un assert sobre el objeto que se le pasa, asumo que el mensaje de OBJ2 modifica algo del OBJ1, en general los assert tienen que verificar las post condiciones de los métodos para cada uno de los posibles casos.
Saludos,
Edson
Hola!
Claro, esos tests con assert los tengo, pero en tests más de integración (2, 3), el primero en test de la clase OBJ2.
Entonces no se puede probar si un mensaje es mandado o no, verdad?
Porque yo quería probar que se mandara el mensaje para no depender de chequear el estado de los objetos para poder hacer un test unitario de la clase que manda el mensaje. Porque quizás ese mensaje que se envía, supongamos teóricamente un "pasó un día", quizás hay objetos del freezer que reciban ese mensaje y no hagan nada que se refleje en su estado. No sé si me expliqué bien, perdón.
Si con esos tres test estamos bien, sigo con eso para la entrega!
Gracias
Robinson
Hola Robinson:
Entonces no se puede probar si un mensaje es mandado o no, verdad?
No. Y el problema no es que no se pueda, si no que no deberías siquiera intentarlo. Cuando estás escribiendo las pruebas de MensajeOBJ1 no tenés idea de la manera en la que la implementación de ese mensaje resolverá el requerimiento. Solamente sabés las pre- y las postcondiciones que es lo único que te interesa. Esto es lo que se conoce como "prueba de caja negra". Luego, como dice Edson, necesitás hacer pruebas para las invariantes del mensaje de OBJ2 independientemente de que sea enviado por OBJ1 o por cualquier otro objeto. Te recomiendo revisar esta lectura acerca del enfoque de las pruebas unitarias.
Porque quizás ese mensaje que se envía, supongamos teóricamente un "pasó un día", quizás hay objetos del freezer que reciban ese mensaje y no hagan nada que se refleje en su estado. No sé si me expliqué bien, perdón.
Si hay mensajes que, al ser enviados, no cambian el estado de ningún objeto, entonces es probable que su existencia no tenga sentido. Puede tenerlo si son mensajes polimórficos de manera tal que en algunos objetos cambia el estado de una forma, en otros de otra y en otros quizás no lo cambia. En ese caso las pruebas que hagas deben verificar que el estado se haya cambiado o mantenido de la manera que vos pretendías.
Saludos,
Tomás
¡¡Completísima la respuesta, gracias!!
Sí, los mensajes hacen o no algo por polimorfismo. Pero ahora entiendo que están cubiertos los casos con otras pruebas, gracias!
Igual para este trabajo práctico 1 no tengo esa situación sobre la que preguntaba, solo quería entenderlo mejor. Voy a complementar con la lectura que adjuntaste.
Gracias de nuevo.