如何为“发送 - 接收”方法编写单元测试?

时间:2016-01-20 15:30:27

标签: c# unit-testing io moq device-driver

如何为一个执行发送 - 接收操作的方法编写单元测试,以便与通用设备进行通信?

在以下示例中,为了查询串行设备(MyDevice.Read方法),将以特定方式格式化的字符串发送到设备,并且设备根据发送的消息以特定字符串进行响应。 / p>

这是模拟串口所需的接口:

public interface ISerialPort
{
    void WriteLine(string text);

    void ReadLine(string text);
}

这是使用该接口的客户端类:

public class MyDevice
{
    private ISerialPort _port;

    public MyDevice(ISerialPort port)
    {
        _port = port;
    }

    public DeviceResponse Read(...)
    {
        _port.WriteLine(...);

        string response = _port.ReadLine();

        // Parse the response.
        return new DeviceResponse(response);
    }
}

这是我写的Read方法的单元测试(故意/异常测试被遗漏):

[TestClass]
public class MyDeviceTests
{
    [TestMethod]
    public void Read_CheckWriteLineIsCalledWithAppropriateString()
    {
        Mock<ISerialPort> port = new Mock<ISerialPort>();

        MyDevice device = new MyDevice(port.Object);

        device.Read(...);

        port.Verify(p => p.WriteLine("SpecificString"));
    }

    [TestMethod]
    public void Read_DeviceRespondsCorrectly()
    {
        Mock<ISerialPort> port = new Mock<ISerialPort>();

        MyDevice device = new MyDevice(port.Object);

        port.Setup(p => p.ReadLine()).Returns("SomeStringFromDevice");

        DeviceResponse response = device.Read(...);  

        // Asserts here...
    }

    ...
}

另一个疑问:为了检查是否应该使用特定参数调用方法,编写测试是否正确?

1 个答案:

答案 0 :(得分:1)

这是对这种设备进行“单元测试”的好方法。除非您想要连接真实设备或模拟设备。

你应该保持每个测试的简单性和重点 - 即当测试读取时返回预期的字符串(没有别的)并检查系统行为,写入时验证是否使用完全字符串调用了写入。