Lilypie Primer PicLilypie Primer Ticker

viernes, 28 de marzo de 2008

Google Code University

Recientemente (bueno, no tanto) salió a la luz un sitio llamado Google Code University, que tiene recursos interesantes sobre lenguajes (actualmente C++, Java y Python), AJAX, Seguridad en la Web, Aplicaciones distribuidas, MySQL y otras cosas.

Aunque al momento el material no es muy abundante, los temas que se incluyen son realmente interesantes y varios de ellos son bastante especializados. Vale la pena darle una mirada.

La direccion es http://code.google.com/edu/

Saludos

miércoles, 19 de marzo de 2008

[OT] Dia del Padre

Hoy 19 de marzo se celebra en mi país (Bolivia) el Día del Padre.

Este dia es muy especial para mí porque es la primera vez que puedo celebrarlo, pues en noviembre del año pasado nació Areli, mi primera hijita, que hoy cumple 3 meses, 3 semanas y 4 dias. Ella es el mejor regalo que Dios me pudo haber dado.

Quise compartir esta felicidad con ustedes, mis amigos lectores, y aprovecho para desear un "Feliz Dia del Padre" a todos los padres que visitan este blog, aunque hoy no se celebre el Dia del Padre en los diferentes paises :)

Aqui les dejo una foto donde aparezco con ella en un viaje que hicimos la semana pasada.
















saludos

martes, 18 de marzo de 2008

Incluir los métodos privados en las pruebas unitarias

Aunque existe un gran debate acerca de si se debe incluir o no los métodos privados en las pruebas unitarias, siempre es bueno disponer de alguna forma de hacerlo.

En este post les mostraré una sencilla forma de invocar métodos privados usando Reflection.

Implementaremos la clase PrivateMethodCaller asi:

public class PrivateMethodCaller
{
public static object Invoke(Type t, string methodName, object[] parameters)
{
MethodInfo mi = t.GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic);
return InvokeMethod(mi, null, parameters);
}

public static object Invoke(object instance, string methodName, object[] parameters)
{
MethodInfo mi = instance.GetType().GetMethod(methodName, BindingFlags.NonPublic|BindingFlags.Instance);
return InvokeMethod(mi, instance, parameters);
}

private static object InvokeMethod(MethodInfo mi, object instance, object[] parameters)
{
if (mi == null)
{
throw new InvalidOperationException("No se pudo encontrar el método");
}
return mi.Invoke(instance, parameters);
}
}

Nuestra clase contiene un solo método: Invoke que toma dos formas:

La primera acepta un parámetro tipo Type. Esta versión del método nos permite invocar métodos estáticos.

La segunda acepta un parámetro tipo object. Esta versión nos permite invocar métodos no estáticos.

Veamos ahora como usamos esta clase desde nuestras pruebas unitarias.

Crearemos una clase muy simple que nos servirá como ejemplo:

public class ClassUnderTest
{
private static int StaticMethod(int a, int b)
{
return a + b;
}
private int InstanceMethod(int a, int b)
{
return a + b;
}
}

Hemos definido dos métodos en nuestra clase de prueba. Uno estático y el otro de instancia.

Ahora veamos como implementamos nuestras pruebas unitarias usando NUnit:

[TestFixture]
public class PrivateMethodTests
{
[Test]
public void StaticMethodTest()
{
int res = (int)PrivateMethodCaller.Invoke(typeof(ClassUnderTest), "StaticMethod", new object[] { 1, 2 });
Assert.AreEqual(3, res);
}

[Test]
public void InstanceMethodTest()
{
int res = (int)PrivateMethodCaller.Invoke(new ClassUnderTest(), "InstanceMethod", new object[] { 4,5});
Assert.AreEqual(9, res);
}
}


Como podemos ver ya somos capaces de invocar los métodos privados y testear sus resultados.

Espero que esta información les sea de utilidad.

Saludos.