将传递的参数设置为Moq中的特定值

时间:2015-06-06 13:49:29

标签: c# unit-testing moq

我正在测试一个通过串口与硬件设备通信的类。我创建了一个接口来隔离System.IO中的Read类:

  public bool IsDevicePresent()
  {
     byte[] buffer = new byte[3];
     int count = 0;
     try
     {         
        port.Write(new byte[] { 0x5A, 0x01 }, 0, 2);
        count = port.Read(buffer, 0, 3);
     }
     catch (TimeoutException)
     {
        return false;
     }
     return (buffer[0] == 0x07 && count == 3);
  }

我的班级中有一个函数调用port,并检查特定值。例如:

ISerialPort

IsDevicePresentISerialPort的实例。

我正在尝试为buffer函数编写一些测试,使用Moq来模拟buffer。但是,我无法弄清楚如何让Moq在传递的字节数组(var mock = new Mock<ISerialPort>(); mock.Setup(m => m.Read(It.IsAny<byte[]>(), It.IsAny<int>(),It.IsAny<int>())) .Returns(3); )中设置值。我可以让Moq返回3,但是如何让Moq将It turned out the rc file was somehow corrupted by VS2010 at some point. I had the original version in source control and re-merged them manually to fix it. The corrected code looks like this: GUIDELINES DESIGNINFO BEGIN IDD_ABOUTBOX, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 163 TOPMARGIN, 7 BOTTOMMARGIN, 55 END END 中的第一个字节设置为0x07?

a = b + c * d;

2 个答案:

答案 0 :(得分:5)

您可以使用Callback方法访问传入参数并设置传入缓冲区的第一个元素:

mock.Setup(m => m.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
    .Returns(3)
    .Callback<byte[], int, int>((buffer, offset, count) => { buffer[0] = 0x07; });

您可以在Returns

中执行相同的操作
mock.Setup(m => m.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
    .Returns<byte[], int, int>((buffer, offset, count) =>
    {
        buffer[0] = 0x07;
        return 3;
    });

但使用Callback比在Returns

内部产生副作用更容易理解

答案 1 :(得分:0)

为了跟进@ nemesv的回答,编译器不喜欢Callback方法中的泛型参数,所以我不得不使用lambda中的类型。

mock.Setup(m => m.Read(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>()))
.Callback((byte[] buffer, int offset, int count) => {}).Returns(3);