如何使用Moq修改模拟方法的调用参数?
问题描述:
是否可以修改模拟方法的调用参数?具体而言,我期待在以下示例中将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?
答
您可以使用回拨方法。像这样的事情(从内存中):
var buffer = new byte[64];
// ...
mock.Setup(m => m.Read(buffer, offset, count))
.Callback((buffer, offset, count) => /* fill in buffer here */);
马克你好。感谢你的回答。如果我使用这种模式,我的单元测试只会在委托执行时回调的那一点停止。调试问题表明缓冲区字节数组为'null'。任何想法为什么会发生? – 2010-02-02 13:03:39
除非您指定它,否则它为空。上述安装程序调用不会*分配缓冲区变量 - 它匹配现有的变量。在你的编辑中,你匹配'It.IsAny()',但是调用者仍然必须提供这个值。 –
2010-02-02 13:47:26