martes, 22 de marzo de 2011

Testing. No metas un Assert en un for…

Haciendo el test de un método que me ordena un DropDownList me encontré que me daba como fallido, a pesar de que visualmente si que comprobaba que ordenaba correctamente.

El código del test es algo así:

        [TestMethod()]
[HostType("ASP.NET")]
[UrlToTest("http://localhost/qclientes/")]
public void ordenarDropDownListEstadosTest()
{
/// Me traigo todos los estados y los cargo en el combo
DropDownList ddlEstados = new DropDownList();
ddlEstados.DataSource = EstadosContactoManager.GetListadoRaices();
ddlEstados.DataValueField = "id";
ddlEstados.DataTextField = "estado";
ddlEstados.DataBind();

DropDownList actual;
int indiceSiguiente = 0;
Boolean estaOrdenado = true;

/// Pruebo el método que ordena el combo por orden alfabético
actual = EstadosContactoManager.ordenarDropDownListEstados(ddlEstados);

Assert.IsNotNull(actual, "Ha devuelto un combo nulo");
Assert.IsTrue(actual.Items.Count > 0, "El número de items es 0");

/// Hago un bucle en donde compruebo que el valor del primer carácter del item sea menor o igual que el siguiente en la colección.
/// Se inicia en uno porque el primer item del combo es el de "Seleccione una opción" y, lógicamente, no está ordenado.
for (int indice = 1; indice < (actual.Items.Count - 1); indice++)
{
if (estaOrdenado)
{
indiceSiguiente = indiceSiguiente >= actual.Items.Count ? indice : indice + 1;
estaOrdenado = (int)actual.Items[indice].Text.ToUpper()[0] <= (int)actual.Items[indiceSiguiente].Text.ToUpper()[0];
}
}
Assert.IsTrue(estaOrdenado, "No está ordenado");
}


Mi primera opción fue meter el Assert.IsTrue dentro del for… pero me encontré que me está dando una excepción del propio Framework de testing. Por lo cual he creado una variable booleana que me hace la comparación a menos que aparezca algo que no está ordenado.



Y esto funciona muy bien.



Editado: El test me fallaba porque si la primera letra es en minúscula y la segunda en mayúscula los códigos ascci no coinciden con el orden visual. Por lo cual ambos caracteres los pongo en mayúscula y me quito el problema. Así mismo he quitado el uso de un substring, ya que le índice [0] me basta.

No hay comentarios: