2010-06-22 5 views
14

Ich bekomme ein Moq-Objekt, das bei aufeinander folgenden Aufrufen einer Methode unterschiedliche Werte zurückgibt. Dies wird durch diese Erweiterungsmethode durchgeführt:Rückgabe verschiedener Ergebnisse oder Auslösen von Ausnahmen aus aufeinanderfolgenden Aufrufen an Moq Mock

Jetzt möchte ich einen der Aufrufe eine Ausnahme auslösen, während andere etwas zurückgeben. Hat jemand das schon mal gemacht?

Wenn ich das tun

mock.Setup(m => m.SomeMethod()) 
    .Throws(new Exception()); 
mock.Setup(m => m.SomeMethod()) 
    .Returns("ok"); 

dann das erste Setup überschrieben wird und nur die zweite Einrichtung weiterhin besteht.

Antwort

9

Ich verwendete Rückruf-Verkettung beim Entwickeln von Wiederholungs-Proxy.

var src = new Mock<ITest>(); 
src.Setup(s => s.RaiseError()).Callback(() => 
src.Setup(s => s.RaiseError())).Throws<Exception>(); 

const int retryCount = 1; 
var proxy = RetryProxy.MakeFor(src.Object, retryCount); 

proxy.RaiseError(); 
src.Verify(s => s.RaiseError(), Times.Exactly(retryCount+1)); 
+0

Diese (eher gewundenen) Lösung nicht mehr notwendig ist, da Moq Unterstützung für die SetupSequence Methode hat. Siehe meine Antwort unten für ein Beispiel. – nashwan

10

Heute Moq (Version 4+) unterstützt dies durch seine SetupSequence Methode. Eine Einführung finden Sie unter this post.

+1

Aber in der offiziellen Version erlaubt es nicht, einen Wert von verspotteten Methode nach dem Auslösen einer Ausnahme zurückgeben (immer noch in umgekehrter Reihenfolge möglich) - https://code.google.com/p/moq/issues/detail? id = 319 – Marek

0

Verwenden Sie für das Mock-Objekt.

Zum Beispiel die Folgenden wird die Ausnahme auf dem ersten Aufruf werfen und das Rück someResponse auf dem zweiten Aufruf:

myService.SetupSequence(s => s.PlaceOrder()) 
    .Throws(new Exception()) 
    .Returns(someResponse); 
+0

Würfe gibt void zurück, so dass diese Bestellung nicht erlaubt ist (mit Moq Version 4.0) –

+0

Sind Sie sicher? Ich benutze diese Codezeile und es funktioniert gut für mich. Ich benutze Moq Version 4.0.30319. Sind Sie sicher, dass Ihre "PlaceOrder()" (oder äquivalente Methode) tatsächlich aufgerufen wird? – nashwan

+0

Ich verwende Moq.WithoutCastle-Version 4.0.10827.2 und der Code wird nicht kompiliert. Vielleicht ist es eine Einschränkung von Moq.WithoutCastle. –

Verwandte Themen