Как мне написать модульные тесты для класса, который зависит от SerialPort? - PullRequest
9 голосов
/ 12 мая 2009

Я знаю, что краткий ответ - издевательство, но любые примеры были бы хорошими. Мне нужно иметь возможность проверить следующее:

  1. Подключение / отключение
  2. Получать данные через заданные интервалы
  3. Пауза в передаче данных, в результате чего мой класс пытается восстановить соединение
  4. Проверьте, что события запускаются, когда ожидается.

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

Ответы [ 3 ]

3 голосов
/ 24 сентября 2009

Похоже, вы хотите проводить интеграционное тестирование, а не модульное тестирование?

Если вы имеете в виду модульное тестирование, вы можете:

  1. Создание оболочки вокруг последовательного порта
  2. Дайте оболочке интерфейс, возможно, IPort
  3. Передайте это в класс, который требует SerialPort
  4. Макет SerialPost, который передается в

internal interface IPort
{
   void Connect(); 
   //Other members
}

internal class SerialPort : IPort
{
   public void Connect() 
   {
      //Implementation
   }
}

public class DataRetriever
{
   private IPort _port;
   public DataRetriever(IPort port)
   {
       _port = port;
   }

   public void ReadData()
   {
      _port.Connect();
   }
}

Теперь вы можете протестировать класс Data Retriever. К сожалению, когда вы приближаетесь к фреймворку (например, к оболочке SerialPort), вы не можете выполнить его модульное тестирование. Вам нужно будет оставить это для интеграционных тестов.

2 голосов
/ 12 мая 2009

http://en.wikipedia.org/wiki/COM_port_redirector перечисляет некоторые бесплатные / открытые исходные драйверы / перенаправители виртуального COM-порта, которые могут быть полезны для вашего тестирования!

0 голосов
/ 12 мая 2009

Я успешно использовал приведенное ниже, но только для проверки обработки данных и внутренних таймингов. Это не может справиться с закрытием / открытием TestingClass самого SerialPort.

        using (NamedPipeServerStream input = new NamedPipeServerStream("Test", PipeDirection.InOut))
        using (NamedPipeClientStream pipeClient = new NamedPipeClientStream("Test"))
        using (MemoryStream output = new MemoryStream())
        using (StreamReader inSerial = new StreamReader(pipeClient))
        using (StreamWriter outSerial = new StreamWriter(svpConsumer))
        {
            StartPipeServer(input);
            pipeClient.Connect();
            using (TestingClass myTest = new TestingClass(onSerial, outSerial))
            {
               input.Write(...);
               input.Flush(...);
               Assert on checking output
            }
        }

где:

    internal void StartPipeServer(NamedPipeServerStream pipeServer)
    {
        Thread thread = new Thread(WaitForConnections);
        thread.Start(pipeServer);
    }

    internal void WaitForConnections(object o)
    {
        NamedPipeServerStream pipe = (NamedPipeServerStream)o;
        pipe.WaitForConnection();
    }

НТН, RiP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...