TDD Paso a Paso (1) Primer Test

Siguiente Post


Comenté en el post Coding Dojo – TDD on the Rocks el ejercicio que hicimos en conjunto con el bueno de @HernanWilkinson. Quisiera hoy comenzar una serie explicando un poco mi estilo de programar ese ejercicio, para ir viendo las diferencias con lo visto en el coding dojo. No digo que sea mejor o peor, pero sí que es la forma en la que me siento más cómodo. Esta forma de encarar TDD (Test-Driven Development) la estoy publicando en


https://github.com/ajlopez/TddOnTheRocks/tree/master/MySrc


Pueden ver ahí el log de lo que fui escribiendo: estuve enviando commit al repositorio Git prácticamente por cada paso. Les recuerdo el problema:


- Calendario de días laborables y no laborables


- Se debe saber si una fecha particular es laborable o no


- Se debe configurar con:


- día de la semana no laboral (ej. Domingo)

- día de mes no laboral (ej. Primero de Enero)

- fecha particular no laboral (ej. 4 de Abril de 2012)


Primero, construí una solución en C# con Visual Studio, con dos proyectos: uno de librería de clases, y otro de test:



Vean que fui creando una clase para los tests, y otra clase para lo que quieron implementar. Ahí difiero del “approach” de @HernanWilkinson, que llamó a la clase de tests con un nombre no significativo. Yo prefiero empezar con un nombre más relacionado con el problema, aunque puede que después lo cambie.


El primer tests, para mí, es probar que los lunes, en general, son un día laborable. Este fue mi primer test:


[TestMethod]
public void TypicalMondayIsAWorkingDay()
{
	WorkingDaysCalendar calendar = new WorkingDaysCalendar();
	
	DateTime monday = new DateTime(2012, 3, 12);

	Assert.IsTrue(calendar.IsWorkingDay(monday));
}

Acá otra “departure” del ejercicio del coding dojo. Mientras que aquel día codificamos el test poniéndole un nombre neutro como test1, yo prefiero darle un nombre significativo desde el principio, aunque después lo cambie. Me queda claro qué estoy intentando hacer, y también para cualquiera que lo vea. No me ha pasado con frecuencia que tenga que cambiar radicalmente el nombre a un test. Pueden ver los logs de proyectos de código abierto (por ejemplo los de GitHub), para notar que no he necesitado mucho el “renaming” de nombre de test.


Pero este test no compila. Armé una primera clase:


public class WorkingDaysCalendar
{
	public bool IsWorkingDay(DateTime day)
	{
		throw new NotImplementedException();
	}
}

que consigue que el test compile, pero al ejecutarlo, da rojo. El código mínimo que consiguió que pase a verde:


public bool IsWorkingDay(DateTime day)
{
	return true;
}

No hay mucho lugar para hacer refactor, en este punto. Pero mejoré el código de test, para afirmar/controlar explícitamente que la fecha que estoy usando es un lunes:


[TestMethod]
public void TypicalMondayIsAWorkingDay()
{
	WorkingDaysCalendar calendar = new WorkingDaysCalendar();
	
	DateTime monday = new DateTime(2012, 3, 12);
	Assert.AreEqual(monday.DayOfWeek, DayOfWeek.Monday);

	Assert.IsTrue(calendar.IsWorkingDay(monday));
}

En el coding dojo usamos una función someSunday() (en este caso sería someMonday()), pero todavía no la necesité. Así que para mantener el test simple, me bastó crear una fecha de lunes directamente en el código del test. Para cualquiera que lea el test dentro de un año, me aseguro que la fecha elegida sea la de un lunes.


En el próximo post comentaré los siguientes tests que se me ocurrieron: probar que un domingo típico es no laborable, y que un sábado típico tampoco. Veremos cómo fue emergiendo la implementación interna, y al llegar a nuevos tests, cómo esta implementación fue siendo mejorada y refactorizada.


Jeje… “dog fooding”, el código de arriba fue “coloreado” con Acquarella.


Nos leemos!


Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 10549, 11699, 3463, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>