2016-01-20 3 views
2

Как записывать модульные тесты для метода, который выполняет операцию отправки-отправки в 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 ее сомнение: правильно ли написать тест, чтобы проверить, следует ли вызывать метод с конкретными аргументами?

+0

Я не уверен на 100%, я понимаю вопрос, но я думаю, что вы обязаны писать код в серийном порту mock, чтобы он отвечал на набор запросов с заданным набором ответов. Возможно, «Словарь» ответов зависит от запросов? Это ваш запрос? –

ответ

1

Это хороший способ «модульного тестирования» такого устройства. Если вы не хотите подключать реальное устройство или моделировать его.

Вы должны держать каждый тест простым и точным - то есть при тестировании чтения возвращать ожидаемую строку (и ничего больше) и проверять поведение системы, при записи проверяйте, что запись вызывается с точной строкой.

Смежные вопросы