¿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.