Hace 2 semanas escribí un post, sobre como testear métodos privados, no me percaté que con esta forma solo se podían escribir test unitarios para métodos de instancia, para los métodos estáticos privados se utiliza otra modalidad.

Supongamos que por alguna razón usted necesita métodos estáticos (que según yo, junto con la sentencia if, son el diablo, un cáncer que hay que aprender a vivir con el, pero intentar erradicarlo) y que por una razón aún más oscura se deben testear (como acotó Erwin en el post anterior, se debe testear comportamiento y no implementación), esto no debería suceder, pero supongamos.

Modifiquemos la clase matemática que teníamos antes para hacer la maldad de dejarla estática 😥 … debo insistir…


public static class Matematica
{
private static int SumaNumeros(int x, int y)
{
int acumulador = 0;
for (int i = x; i <= y; i++)
{
acumulador += i;
}
return acumulador;
}
}

Con esto se debe crear otro método de prueba para esta clase, esto quedaría de la forma


[TestMethod]
public void ProbandoSumadorEstaticoPrivado()
{
//Se crea una clase PriveteType que envuelve a la clase Matemática
//para luego poder invocar su método estático privado
var privateTest = new PrivateType(typeof(Matematica));
//Se utiliza el método invocar estático para invocar y su resultado
//se almacena en la variable obj
object obj = privateTest.InvokeStatic("SumaNumeros", 1, 4);
//Se testea el retorno del método en el objeto obj.
Assert.AreEqual(10, (int) obj);
}

Como se ve, se crea un objeto para envolver la clase Matemática que es estática, este objeto es de tipo PrivateType, con este objeto creado y a través de ese objeto, se puede acceder al método InvokeStatic, entregando como parámetro el nombre del método estático privado que se quiere testear y hacia al lado los parámetros de entrada de dicho método estático, como resultado entrega un objeto de tipo object, que como la vez anterior debía ser convertido al tipo del resultado que entrega el método para hacer el assert.

Eso, se los dejo, espero sinceramente que nunca lo usen, pero si no hay de otra, acá como se hace.