web-dev-qa-db-de.com

RhinoMocks - Verspotten einer Methode, deren Rückgabewert sich bei mehreren Aufrufen ändert (auch wenn derselbe Parameter übergeben wird)

Ich möchte herausfinden, wie ich eine Methode verspotten kann, die einen anderen Wert zurückgibt, wenn sie zum ersten Mal aufgerufen wird. Zum Beispiel so etwas:

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);
}

Gibt es irgendetwas, das dies möglich macht? Neben der Implementierung eines Sub für den Getter, der eine Zustandsmaschine implementiert?

Prost Jungs,

Alex

20
AlexC

Sie können Rückgabewerte mit der Methode .WhenCalled abfangen. Beachten Sie, dass Sie den Wert weiterhin über die .Return -Methode bereitstellen müssen. Rhino ignoriert ihn jedoch einfach, wenn die ReturnValue durch den Methodenaufruf geändert wird:

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));

Bearbeiten:

Wenn man sich ein bisschen mehr umschaut, scheint es, dass .Repeat.Once() in diesem Fall tatsächlich funktioniert und verwendet werden kann, um dasselbe Ergebnis zu erzielen:

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();

Gibt bei aufeinanderfolgenden Anrufen 1, 2, 3 zurück.

32
k.m

Einfach benutzen

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

Dadurch wird beim ersten Aufruf 1 und beim zweiten Aufruf 2 zurückgegeben. Zumindest auf RhinoMocks 3.6.0.0

6

Ist die Zeit der bestimmende Faktor für die Rückgabe der Methode? In diesem Fall würde ich versuchen, den Zeitablauf zu abstrahieren, damit Sie in Ihren Tests die direkte Kontrolle darüber haben.

So etwas wie eine Schnittstelle namens ITimeProvider mit einem Member namens GetElapsedTime () und erstellen Sie dann eine Standardimplementierung, die in Ihrer gesamten Anwendung verwendet werden soll.

Übergeben Sie dann beim Testen einen verspotteten ITimeProvider, damit Sie steuern können, welche Wahrnehmung Ihre Anwendung als Zeitüberschreitung ansieht.

0
theMothaShip