TDD: Cuando con 2 Asserts estás cometiendo un error

En mi avance por el mundo del TDD ayer descubrí algo que estaba haciendo mal (o realmente, queriendo hacer mal). Era algo tan sencillo como que si dentro de un test necesitas dos asserts probablemente es que el planteamiento que estás haciendo sea erróneo e intentes abarcar en un test más de lo que deberías.

Pero veamos el caso poco a poco, partimos de la página de index con la que estoy trabajando en estos días migrando futboleo.es a MVC4. Cómo es un proyecto para ir aprendiendo y practicando cosas, pues me decidí a que de paso que hacía la migración pues podría mejorar mis aptitudes en MVC4 y además aprender algo de TDD que seguro que no me vendrá mal en el futuro. De modo que esta es la página de inicio que paso a explicar:

indexfutboleo

Cómo se puede ver todavía está muy verde el tema, pero vamos con lo esencial, la página en sí no tiene nada, por tanto un test básico sería el saber si la vista se presenta ante el usuario o si no lo hace de la siguiente forma:

[TestMethod]
public void Index()
{
	HomeController controller = new HomeController();
	ViewResult result = controller.Index() as ViewResult;
	Assert.IsNotNull(result);
}

Pero llegados a este punto quise enredar las cosas más de lo que debería y quería validar que además de presentarse la página los datos de los listados de jugadores fuesen coherentes con lo que quería mostrar. Así que se me ocurrió en el momento la brillante idea de que anidara assert debajo validando los datos de la viewbag que paga del controlador a la vista. Los versados en el tema se estarán echando las manos a la cabeza en este momento y con un pensamiento único: ¿pero qué haces loco?. Y estoy de acuerdo con ellos, los estaba haciendo mal. En el momento no le veía mucho sentido a eso así que me puse en contacto con @PabloCVergara que es una de las persona que conozco que más sabe acerca del tema TDD para solicitarle su consejo. De modo que fui claro, le pregunté hasta que punto estaría mal tener más de un assert en un único test. Y la respuesta fue bastante clara.

Curioso el caso, así que un anti-patrón… y te pones a pensar y… oh… wait… Sí, efectivamente estaba metiendo la pata y los listados de jugadores pretendía validarlos en un punto de una capa qué no le correspondía. El controlador de la página de inicio es el siguiente:

public ActionResult Index()
{
	FutboleoMVC.Controllers.Futboleo core = new Futboleo();

	//Sacamos la lista de los porteros mejor puntuados
	ViewBag.Porteros = core.ListadoJugadores(Futboleo.Posiciones.Portero, 5);

	//Sacamos la lista de los defensas mejor puntuados
	ViewBag.Defensas = core.ListadoJugadores(Futboleo.Posiciones.Defensa, 5);

	//Sacamos la lista de los medios mejor puntuados
	ViewBag.Medios = core.ListadoJugadores(Futboleo.Posiciones.Medio, 5);

	//Sacamos la lista de los delanteros mejor puntuados
	ViewBag.Delanteros = core.ListadoJugadores(Futboleo.Posiciones.Delantero, 5);

	return View();
}

Y con esta estructura, la validación de si el listado es correcto o no, debería hacerla con un test que valide que el método ListadoJugadores devuelve tanto jugadores de la posición que corresponde como el número de jugadores solicitados. Sin duda un error que a más de uno le habrá sucedido o le sucederá en el futuro y que apuesto a que no volveré a cometer, evidentemente me queda mucho por aprender, pero una lección menos.

PD: Quería darle las gracias de nuevo a Pablo por su ayuda y sus referencias tanto a documentación que me sirvió para darme cuenta de mi error cómo luego que me dijo que le hacía ilusión que estuviera intentando aprender TDD. Muchas gracias Pablo.

Comments are closed here.