Revisando el código de los compañeros me topé con el siguiente TEST:
[Test]
public void Rechazar_CuandoLaSolicitudEstaPendienteDeAprobacion_MarcaLaSolicitudComoRezazada()
{
var storage = new Mock<ISolicitudStorage>();
storage.Setup(x => x.ObtenerPorId(100))
.Returns(new Solicitud {
Id = 100,
Estado = Estados.PendienteDeAprobacion
});
storage.Setup(x => x.CambiarEstado(100, Estados.Rechazada));
var servicio = new SolicitudServicio(storage.Object);
servicio.Rechazar(100);
storage.Verify(x => x.CambiarEstado(100, Estados.Rechazada), Times.Once);
}
Ahora bien mi conflicto existencial con este test o este tipo de pruebas es que hay algo que me hace pensar que está probando la implementación del método Aprobar mas que el resultado de lo que hace. por ejemplo, ¿que pasaría si yo hago un refactoring y ahí descubro que debería eliminar el método ISolicitudStorage.CambiarEstado porque hay otro en otro lugar que hace exactamente lo mismo? yo modificaría el método Aprobar para llamar al ISolicitudStorage.ActualizarSolicitud por ejemplo en lugar del CambiarEstado. Eso haría fallar mi test, aunque no quiera decir que mi funcionalidad esté mala, sino que cambie la forma en la que apruebo una solicitud obteniendo el mismo resultado.
Ahora bien, para rediseñar el test yo estaba pensando involucrar a una base de datos de pruebas (aunque algo me dice que eso podría llegar a ahogarme en algún momento jejeje). Por ejemplo, pensaba cambiar el test para que se viera algo como esto (pensaba abrir una transaccion en el Setup y hacerle rollback al finalizar el test):
[Test]
public void Rechazar_CuandoLaSolicitudEstaPendienteDeAprobacion_MarcaLaSolicitudComoRezazada()
{
var storage = new OracleSolicitudStorage("TestsConnectionString");
var servicio = new SolicitudServicio(storage);
servicio.Rechazar(100);
var solicitud = sotage.ObtenerPorId(100);
Assert.AreEqual(Estados.Rechazada, solicitud.EstadoId);
}
Creo que con este test ya no importaría la forma en la que yo altero el estado de la solicitud, lo importante es que al rechazar se altere el estado de esa solicitud, este test soporta un poco mas refactorización en el método Rechazar que el test anterior. ¿no sé que tanto de la implementación de un método deba conocer el test? ¿ambos tests están incorrectos :)? ¿Podría lograr un resultado similar utilizando Moks y no conectarme a la base de datos?.
¿Algunos Tips generales para realizar Tests que sean realmente útiles y que no implique que la refactorización de mis clases impliquen siempre refactorización de mis tests?
Gracias, Miguel Román.
--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/altnet-hispano.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Oscar,
Muy bueno el artículo de Martin Fowler!
Consulto para quien use Moq, los Stubs serían usando el Mock.Of<> ?
Saludos,
César
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispano+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-hispano@googlegroups.com.
Visita este grupo en http://groups.google.com/group/altnet-hispano.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
Has recibido este mensaje porque estás suscrito al grupo "AltNet-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispano+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-hispano@googlegroups.com.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a altnet-hispan...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a altnet-...@googlegroups.com.
Hola Oscar,
Ajam, esa forma no la había visto antes en Moq, alguna vez intenté usar el SetupProperty pero no recuerdo esa implementación. Y como no pude lograrlo terminé creando el objeto en sí. Voy a retomar esos casos a ver si lo logro.
Gracias por el aporte, y perdón por desviar un poco el hilo!
Saludos,
César
"is tdd dead?"
No, otra vez nooooooooooooooo!!!! ;)
Saludos, Ale Miralles.
PD: +1 para la aclaración de Oscar. (Sobre todo Unit test vs Integration tests).