lunes, 3 de noviembre de 2008

¿Cómo verificar el orden de las llamadas a métodos con Moq?

¿Cómo verificar el orden de las llamadas a métodos con Moq 2.6?

En algunas ocasiones necesitamos verificar en qué orden son llamados métodos que hemos "mockeado" una vez más vemos que nuestro querido Moq no tiene una posibilidad para hacerlo como si la tiene Rhino, pero por supuesto, todo se puede solucionar de la mano de los Callbacks, de esta manera:

public interface IFoo
{
    void Method1();
    void Method2();
    void Method3();
}

public class Sequencer
{
    Posicion contador;

    public enum Posicion
    {
        Primero = 1,
        Segundo = 2,
        Tercero = 3,
        Cuarto = 4
    }

    public void Seq(Posicion place)
    {
        if (++contador != place)
            throw new InvalidOperationException(
                string.Format("El método ha sido llamado {0} pero debería ser llamado {1}", contador,place));
    }        
}

[TestMethod]
public void VerificarOrdenDeLlamadas()
{
    var mock = new Mock<IFoo>();
    var seq = new Sequencer();

    mock.Expect(p => p.Method1()).Callback(() => seq.Seq(Sequencer.Posicion.Primero));
    mock.Expect(p => p.Method2()).Callback(() => seq.Seq(Sequencer.Posicion.Segundo));
    mock.Expect(p => p.Method3()).Callback(() => seq.Seq(Sequencer.Posicion.Tercero));

    mock.Object.Method2();

    mock.Object.Method1();

    mock.Object.Method3();

}

Simple, hasta la próxima.