如何使用Moq修改模拟方法的调用参数?

13
有没有可能修改被模拟方法的调用参数?特别是我想将以下示例中的 buffer 更改为预填充的字节数组。

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

说明:
调用 Read 会从 offset 开始读取 count 字节,并将其加载到提供的字节数组 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,并且单元测试执行在执行此命令后停止。我的语法是否有误或这是一个错误?

1个回答

15

您可以使用回调方法。类似这样的形式(从记忆中提取):

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

嗨,马克。感谢回答。如果我使用这个模式,我的单元测试将会在委托被执行的回调点处停止。调试问题显示缓冲区字节数组是“null”。你有什么想法为什么会发生这种情况? - Timo Kosig
除非你给它赋值,否则它是空的。上面的Setup调用不会分配缓冲变量 - 它匹配现有变量。在你的编辑中,你使用It.IsAny<byte[]>()进行匹配,但调用者仍然必须提供值。 - Mark Seemann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接