TDD Paso a Paso (2) Días No Laborables

Anterior Post 
Siguiente Post 


En el primer post de esta serie, expliqué el problema y el primer test, que va quedando en el repositorio del proyecto.


Veamos ahora el segundo test. Me decidí por probar que un domingo típico es día no laborable, que implica un cambio con respecto al anterior test. En el primer test que  escribimos, preguntábamos por un caso positivo de día laborable. Ahora cambiamos a probar un caso negativo.


El nuevo test:


[TestMethod]
public void TypicalSundayIsANonWorkingDay()
{
    WorkingDaysCalendar calendar = new WorkingDaysCalendar();

    DateTime sunday = new DateTime(2012, 3, 11);
    Assert.AreEqual(sunday.DayOfWeek, DayOfWeek.Sunday);

    Assert.IsFalse(calendar.IsWorkingDay(sunday));
}

Al ejecutarlo, da rojo. El problema es que la actual implementación retorna que todos los días de la semana son laborables. El mínimo cambio en el código que hace que todo funcione es:


public bool IsWorkingDay(DateTime day)
{
    if (day.DayOfWeek == DayOfWeek.Sunday)
        return false;

    return true;
}

Ahora sí funciona, habiendo agregado el if del comienzo. El próximo test que se me ocurre es probar que un sábado típico (más adelante veremos otros calendarios, por ejemplo, el de un peluquero, que acá en Argentina tienen como día no laborable el lunes, y muchos trabajan el sábado Y el domingo; era parte de los requerimientos, poder configurar el calendario). El tercer test, entonces, es:


[TestMethod]
public void TypicalSaturdayIsANonWorkingDay()
{
    WorkingDaysCalendar calendar = new WorkingDaysCalendar();

    DateTime saturday = new DateTime(2012, 3, 10);
    Assert.AreEqual(saturday.DayOfWeek, DayOfWeek.Saturday);

    Assert.IsFalse(calendar.IsWorkingDay(saturday));
}

Mínimo código que hace que el test pase a verde:


public bool IsWorkingDay(DateTime day)
{
    if (day.DayOfWeek == DayOfWeek.Sunday || day.DayOfWeek == DayOfWeek.Saturday)
        return false;

    return true;
}

Agregué un día más no laborable en la condición del if.


Vean que quedaron dos constantes el código de implementación. Por ahora, no me preocupa. Es más: me parece que son constantes que reflejan algo básico del sistema que estamos armando, no son constantes arbitrarias. Comienza a surgir lo que entiendo como calendario típico: semana laborable, excepto sábados y domingo.


No hice mucho refactoring en estos test. Diferencias con el Coding Dojo: sigo usando nombres significativos para los tests (si hay que cambiarlos, los cambio). Tampoco usé métodos auxiliares que me devuelvan un lunes o un domingo o un sábado. Si necesito esos métodos, será porque surjan de refactor de código de tests (probablemente, si necesito obtener un lunes desde más de 2 tests, digamos).


Próximos pasos: ver qué es una semana típica, plasmarla en un test; comenzar a configurar el calendario (tal vez, sábado es laborable, para algunas profesiones, que usaran un calendario configurable para ellas).


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>