TDD Paso a Paso (4) Otro tipo de Semana

Anterior Post 
Siguiente Post 


Ahora veamos de tratar uno de los requerimientos: que los días laborables/no laborables sean configurables, ya sea por feriados puntuales, feriados que se repiten año a año, o porque la propia semana tenga otro reparto de días laborables.


El primero que se me ocurre es contemplar que el sábado sea día laboral. Escribo el test:


 


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

	calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Saturday);

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

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

 


Al ejecutarlo, da rojo, porque el código que tengo hasta ahora pone a los sábados como días no laborables. Siguiendo la idea de poner el mínimo código necesario para pasar el test, y que sigan dando verde los anteriores, éste es el código que agregué (y luego refactoricé un poco):


 


private DayOfWeek? workingDay;

public bool IsWorkingDay(DateTime day)
{
	if (this.workingDay.HasValue && this.workingDay.Value == day.DayOfWeek)
		return true;

	if (day.DayOfWeek == DayOfWeek.Sunday || day.DayOfWeek == DayOfWeek.Saturday)
		return false;

	return true;
}

public void AddDayOfWeekAsWorkingDay(DayOfWeek dayOfWeek)
{
	this.workingDay = dayOfWeek;
}

 


Con esto, el test da en verde. Ejecuto toda la batería de test y sigue dando verde.


Noten que la variable adicional es “nulleable”. Podría haber puesto un arreglo, una lista de días laborables o algo así. PERO NINGUN TEST ME LO PIDIO. Es decir, no hay caso de uso del código que estamos desarrollando que necesite esa flexibilidad. Seguramente en los próximos test tendré que agregarlo. Pero no cruzar el puente ANTES de llegar al puente.


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>