【问题标题】:How to modify an invocation parameter of a mocked method with Moq?如何使用 Moq 修改模拟方法的调用参数?
【发布时间】:2011-01-12 03:00:32
【问题描述】:

是否可以修改模拟方法的调用参数?特别是,我希望将以下示例中的 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 并且单元测试执行此命令后停止执行。是我的语法有问题还是这是一个错误?

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    您可以使用回调方法。像这样的东西(来自记忆):

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

    【讨论】:

    • 嗨,马克。感谢您的回答。如果我使用这种模式,我的单元测试将在执行委托时停止在回调中的那一点。调试问题显示缓冲区字节数组为null。任何想法为什么会发生这种情况?
    • 除非你分配它,否则它是空的。上面的 Setup 调用没有 assign 缓冲区变量 - 它匹配现有变量。在您的编辑中,您匹配 It.IsAny<byte[]>(),但调用者仍必须提供该值。
    猜你喜欢
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2010-10-08
    相关资源
    最近更新 更多