2013-03-06 6 views
8

Für meinen Test brauche ich den ersten Aufruf an einen Stub, um ein Objekt zurückzugeben, und den nächsten Aufruf, um ein anderes Objekt zurückzugeben. Ich habe das in anderen Mock-Object-Frameworks in record() - Blöcken gesehen, aber ich habe nicht herausgefunden, wie man es in FakeItEasy macht. FakeItEasy ist das vorgeschriebene Framework in unserem Shop, und ich verwende AutoFixture, um Fälschungen zu generieren.Rückgabe verschiedener Objekte aus FakeItEasy A.CallTo()

Ich schaute auf NextCall, aber es sieht nicht aus wie ich einen Rückgabewert angeben kann. Hier

ist eine Idee von dem, was Ich mag würde tun:

ReceiveMessageResponse queueResponse1 = fixture.Create<ReceiveMessageResponse>(); 
ReceiveMessageResponse queueResponse2 = fixture.Create<ReceiveMessageResponse>(seed); 
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse1); 
//The following should happen the second time... 
A.CallTo(() => sqsClient.ReceiveMessage(null)).WithAnyArguments().Returns(queueResponse2); 

Jede Hilfe sehr geschätzt wird.

Antwort

14

Zwei Möglichkeiten, es zu tun, einer von ihnen ist, die Sie in Ihrer eigenen Antwort finden:

A.CallTo(() => foo.Bar()).ReturnsNextFromSequence(new[] { response1, response2 }); 

Der andere Weg ist:

A.CallTo(() => foo.Bar()).Returns(response2); 
A.CallTo(() => foo.Bar()).Returns(response1).Once(); 
+0

Ordnung im zweiten Ansatz ist wichtig für das Erhalten es funktioniert – Fabio

7

Und natürlich passiert es jedes Mal. Innerhalb einiger Minuten nach der Veröffentlichung stoße ich auf die Antwort.

ich landete mit:

ReturnsNextFromSequence(new [] {queueResponse1, queueResponse2}); 

Ich bin nicht sicher, es die bevorzugte Methode ist, aber es funktioniert gut für mich.

Verwandte Themen