gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:12:12 26 4
gpt4 key购买 nike

我正在对一个通过串行端口与硬件设备通信的类进行单元测试。我创建了一个接口(interface)来隔离 System.IO 中的 SerialPort 类:

public interface ISerialPort
{
String PortName { get; set; }
bool IsOpen { get; }
void Open();
void Close();
int Read(byte[] buffer, int offset, int count);
void Write(byte[] buffer, int offset, int count);
}

我的类中有一个正在测试的函数,它调用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);
}

portISerialPort 的实例。

我正在尝试为 IsDevicePresent 函数编写一些测试,使用 Moq 来模拟 ISerialPort。但是,我不知道如何让 Moq 在传递的字节数组(buffer)中设置值。我可以让 Moq 返回 3,但是如何让 Moq 将 buffer 中的第一个字节设置为 0x07?

var mock = new Mock<ISerialPort>();
mock.Setup(m => m.Read(It.IsAny<byte[]>(), It.IsAny<int>(),It.IsAny<int>()))
.Returns(3);

最佳答案

您可以使用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中产生副作用更容易理解

关于c# - 将传递的参数设置为 Moq 中的特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com