Как записывать модульные тесты для метода, который выполняет операцию отправки-отправки в orther для связи с универсальным устройством?Как следует записывать единичные тесты для метода «send-receive»?
В следующем примере для запроса последовательного устройства (MyDevice.Read
) строка, отформатированная определенным образом, отправляется на устройство, и устройство отвечает определенной строкой в соответствии с отправленным сообщением.
Это интерфейс необходим для имитации последовательного порта:
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...
}
...
}
Anot ее сомнение: правильно ли написать тест, чтобы проверить, следует ли вызывать метод с конкретными аргументами?
Я не уверен на 100%, я понимаю вопрос, но я думаю, что вы обязаны писать код в серийном порту mock, чтобы он отвечал на набор запросов с заданным набором ответов. Возможно, «Словарь» ответов зависит от запросов? Это ваш запрос? –