c# unit-testing mocking rhino-mocks

c# - RhinoMocks: se burla de un método cuyo valor de retorno cambia(incluso cuando se pasa el mismo parámetro) con varias llamadas



unit-testing mocking (3)

Busco descubrir cómo puedo burlarme de un método que devuelve un valor diferente la segunda vez que se llama a la primera vez. Por ejemplo, algo como esto:

public interface IApplicationLifetime { int SecondsSinceStarted {get;} } [Test] public void Expected_mock_behaviour() { IApplicationLifetime mock = MockRepository.GenerateMock<IApplicationLifetime>(); mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once(); mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once(); Assert.AreEqual(1, mock.SecondsSinceStarted); Assert.AreEqual(2, mock.SecondsSinceStarted); }

¿Hay algo que haga esto posible? ¿Además de implementar un sub para el getter que implementa una máquina de estado?

Saludos amigos

Alex


¿Es el tiempo el factor determinante en lo que devuelve el método? Si es así, trataría de abstraer el pasaje del tiempo para que usted tenga control directo sobre él en sus pruebas.

Algo así como una interfaz llamada ITimeProvider con un miembro llamado GetElapsedTime () y luego crea una implementación predeterminada para usar en toda la aplicación.

Luego, cuando esté realizando la prueba, pase un ITimeProvider simulado para que controle lo que su aplicación percibe como el tiempo transcurrido.


Puede interceptar valores de retorno con el método .WhenCalled . Tenga en cuenta que todavía debe proporcionar valor a través del método .Return , sin embargo, Rhino simplemente lo ignorará si se altera el ReturnValue de la invocación del método:

int invocationsCounter = 1; const int IgnoredReturnValue = 10; mock.Expect(m => m.SecondsSinceLifetime) .WhenCalled(mi => mi.ReturnValue = invocationsCounter++) .Return(IgnoredReturnValue); Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(1)); Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(2));

Editar:

Cavando un poco más, parece que .Repeat.Once() funciona de hecho en este caso y puede usarse para lograr el mismo resultado:

mock.Expect(m => m.SecondsSinceStarted).Return(1).Repeat.Once(); mock.Expect(m => m.SecondsSinceStarted).Return(2).Repeat.Once(); mock.Expect(m => m.SecondsSinceStarted).Return(3).Repeat.Once();

Devolverá 1, 2, 3 en llamadas consecutivas.


Simplemente usar

mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once(); mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();

Esto devolverá 1 durante la primera llamada y 2 durante la segunda llamada. Al menos en RhinoMocks 3.6.0.0