Hola,
Voy a tratar de explicarlo de la mejor manera, pido perdón de antemano si no se entiende algo o parece muy rebuscado. Tengo una duda respecto a como debe ser la prueba de un método donde el objeto al cual se le realiza el test, lo único que hace es delegar. Pongo de ejemplo el siguiente método:
embalarPedido
(pedidos at: 1) embalar.
embalar
estado := 'embalado'.
En el método 'embalarPedido' tengo una Coleccion donde al primer objeto le mando el mensaje 'embalar'. El método al cual yo quisiera hacer una prueba sería 'embalarPedido'. La prueba que hice hasta ahora fue la siguiente:
"Arrange"
| despacho pedido despachoAuxiliar |
despacho := Despacho new.
pedido := Pedido new.
despacho tomarPedido: pedido.
"Act"
despachoAuxiliar := depacho embalarPedido.
"Assert"
self assert: despachoAuxiliar equals: despacho class.
Utilizo la variable ' despachoAuxiliar ' porque tampoco se como hacerlo si solo mando el mensaje, es decir:
despacho embalarPedido.
Obviamente no funciona, y el mensaje de error que da el debugger es:
" Teste Failure: Got a Despacho instead of Despacho "
Espero sus respuestas, y gracias.
Hola, Kevin:
Deberías preguntarte cuáles son las postcondiciones del método que ejecutás en la parte de "Act". Por lo que entiendo sería simplemente marcar como embalado al primer pedido de su colección de pedidos. En ese caso, deberías verificar que eso haya sucedido. Para eso podrías implementar un mensaje en la clase Despacho que devuelva el primer pedido y luego verificar que su estado sea "embalado". Quedaría algo de este estilo:
test01PruebaDespachoEmbalaElPrimerPedidoYCambiaSuEstado "Arrange" | despacho pedido | despacho := Despacho new. pedido := Pedido new. despacho tomarPedido: pedido. "Act" despacho embalarPedido. "Assert" self assert: despacho primerPedido estado equals: 'embalado'.
Queda medio raro igualmente dado que el objeto pedido no tiene ninguna responsabilidad más que almacenar su estado como una cadena de caracteres. Quizás habría que revisarlo en su contexto para ver si tiene sentido en el modelo dependiendo de cuáles sean los requerimientos de lo que querés implementar.
Otras recomendaciones y observaciones:
- En tu ejemplo no entendí por qué utilizaste despachoAuxiliar. No era necesario.
- Tu prueba falla porque estás comparando una instancia de Despacho con la clase de Despacho (que también es un objeto). Si agregás la palabra class en la última línea entre
despachoAuxiliar
yequals
entonces tu prueba pasa, aunque no tiene mucho sentido por lo que mencionaba antes. - Si queremos probar que un objeto devuelto sea de cierto tipo, la mejor manera sería verificar que se comporte como el objeto esperado y no utilizar el mensaje class para eso.
- Todos los mensajes que no tengan una sentencia de retorno explícita (el circunflejo) devuelven
self
por defecto, es decir, la propia instancia. - Si querés acceder al primer elemento de una colección indexable podés usar el mensaje
first
. Análogamente podés usarlast
para acceder al último.
Saludos,
Tomás