2010-02-02 5 views
12

Ist es möglich, einen Aufrufparameter einer Mocked-Methode zu ändern? Insbesondere möchte ich im folgenden Beispiel buffer in ein bereits gefülltes Byte-Array ändern.Wie man einen Aufrufparameter einer verspotteten Methode mit Moq ändert?

Beispiel:
int MockedClass.Read(byte[] buffer, int offset, int count)

Erläuterung:
Aufruf Read Lasten count Bytes aus offset in den mitgelieferten Byte-Array zu lesen buffer.

Jetzt möchte ich Puffer gefüllt haben, nachdem der Anruf zu Read in meinem Anwendungscode gemacht worden ist. Ist das möglich?

Wenn ja, wie würde ich über aufeinanderfolgende Anrufe zu Read gehen? Ich möchte, dass aufeinander folgende Aufrufe jedes Mal, wenn möglich, einen anderen Puffer zurückgeben.

EDIT:

den Setup Befehl wie folgt aus:

MockedClass.Setup(x => x.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()).Callback((byte[] buffer, int offset, int count) => buffer[0] = 0xAA);

gibt mir ein seltsames Problem, wenn das Gerät Test ausführen: Sobald der Anruf zu Read gemacht wird und der Delegierte Code (buffer[0] = 0xAA) ausgeführt wird, zeigt der Debugger an, dass buffer tatsächlich null ist und die Ausführung des Komponententests nach Ausführung dieses Befehls stoppt. Ist meine Syntax geborken oder ist das ein Fehler?

Antwort

14

Sie können die Callback-Methode verwenden. So etwas (aus dem Speicher):

var buffer = new byte[64]; 
// ... 
mock.Setup(m => m.Read(buffer, offset, count)) 
    .Callback((buffer, offset, count) => /* fill in buffer here */); 
+0

Hallo Mark. Danke für die Antwort. Wenn ich dieses Muster verwende, wird mein Komponententest genau an dem Punkt im Callback enden, an dem der Delegat ausgeführt wird. Das Debuggen des Problems hat gezeigt, dass das Pufferbytearray "null" ist. Irgendwelche Ideen, warum das passieren könnte? –

+0

Es ist null, wenn Sie es nicht zuweisen. Der obige Setup-Aufruf weist * die Puffervariable nicht zu - sie entspricht einer vorhandenen Variablen. In Ihrer Bearbeitung passen Sie auf It.IsAny () ', aber der Aufrufer muss immer noch den Wert liefern. –

Verwandte Themen