2010-02-02 188 views
12

是否可以修改模擬方法的調用參數?具體而言,我期待在以下示例中將buffer更改爲預填充的字節數組。如何使用Moq修改模擬方法的調用參數?

實施例:
int MockedClass.Read(byte[] buffer, int offset, int count)

說明:
調用Read負載count字節從offset讀入所供給的字節數組buffer

現在我想在我的應用程序代碼中調用Read之後填充緩衝區。那可能嗎?

如果是,我將如何去連續調用Read?如果可能的話,我希望每次都有連續的調用返回不同的緩衝區。

編輯:

使用Setup命令是這樣的:

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

執行單元測試時給我一個奇怪的問題:一旦呼叫到Read由和委託代碼(buffer[0] = 0xAA )執行時,調試器顯示buffer實際上是null,並且在執行此命令後單元測試執行停止。我的語法是borked還是一個bug?

回答

14

您可以使用回撥方法。像這樣的事情(從內存中):

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

馬克你好。感謝你的回答。如果我使用這種模式,我的單元測試只會在委託執行時回調的那一點停止。調試問題表明緩衝區字節數組爲'null'。任何想法爲什麼會發生? – 2010-02-02 13:03:39

+0

除非您指定它,否則它爲空。上述安裝程序調用不會*分配緩衝區變量 - 它匹配現有的變量。在你的編輯中,你匹配'It.IsAny ()',但是調用者仍然必須提供這個值。 – 2010-02-02 13:47:26

相關問題