es como se hace mediante la construcción de las afirmaciones en cada invocación de métodos aquí.
// Arrange - Build the necessary assertions into the stubbed method invocations.
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method2()));
mock.Stub(m => m.Method2()).WhenCalled(inv => mock.AssertWasNotCalled(m => m.Method3()));
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Dado que se trata se mezcla patrón normal organizar-acto-aserción mediante la ejecución de las afirmaciones a mediados de actuar, me gusta incluir mensajes de error muy específicos para estos casos para identificar fallos de las pruebas con más facilidad.
mock.Stub(m => m.Method1()).WhenCalled(inv =>
mock.AssertWasNotCalled(m => m.Method2(), opt =>
opt.Message("Method2 cannot be called before Method1.")));
También se puede lograr un resultado similar al salvar el resultado de cada invocación de una variable durante el acto paso, y luego la comprobación de los estados variables durante el paso de aserción. Esto preserva mejor la división del patrón arreglar-actuar-afirmar, pero es más un código de plomería para escribir y mantener.
// Arrange - Build the necessary state variables into the stubbed method invocations.
bool wasMethod1Called;
bool wasMethod2Called;
bool wasMethod2CalledBeforeMethod1;
bool wasMethod3CalledBeforeMethod2;
var mock = MockRepository.GenerateMock<ISomeService>();
mock.Stub(m => m.Method1()).WhenCalled(inv =>
{
wasMethod1Called = true;
});
mock.Stub(m => m.Method2()).WhenCalled(inv =>
{
wasMethod2Called = true;
wasMethod2CalledBeforeMethod1 = !wasMethod1Called;
});
mock.Stub(m => m.Method3()).WhenCalled(inv =>
{
wasMethod3CalledBeforeMethod2 = !wasMethod2Called;
});
// Act
myObject.Service = mock;
// Assert - Ensure each expected method was called, and that they were called in the right order.
mock.AssertWasCalled(m => m.Method1());
mock.AssertWasCalled(m => m.Method2());
mock.AssertWasCalled(m => m.Method3());
Assert.That(wasMethod2CalledBeforeMethod1, Is.False, "Method2 cannot be called before Method1.");
Assert.That(wasMethod3CalledBeforeMethod2, Is.False, "Method3 cannot be called before Method2.");
Este no es siempre el caso. Existen contratos de objetos statefull donde el orden importa y no siempre se puede evitar esos contratos. – sanosdole
Estoy de acuerdo con el comentario de @sanosdole, pero en mi caso fue muy acertado. Debería probar el resultado ... no la implementación. ¡Gracias! – MoMo
Si el código ya tiene acoplamiento temporal, también debe probarse. – SerG