Как я пишу модульные тесты на класс, который зависит от SerialPort?

То, что вы, по-моему, пытаетесь сделать, - это просто соединить несколько вещей в функцию. Используя ваш пример, давайте предположим, что new_level - это процент от того фактора, который вы хотите получить в новых данных.

city = c("NYC", "Boston", "NYC", "NYC", "Providence", "Boston", "NYC")
data = data.frame(city=city)

redistribute <- function(data, column, unique_value, new_level){
        ## Names of factors and size of data
        fac_names <- levels(factor(data[,column]))
        size <- nrow(data)

        ## Make new list using rep and sample with desired ratio
        new_col <- c(rep(unique_value,
                        floor(new_level*size)),
                        sample(fac_names[which(fac_names!=unique_value)],
                               size=(size-floor(new_level*size)),
                               replace=TRUE))

        ## Mix up and assign to data frame
        data[,column] <- sample(new_col)
        return(data)
}

redistribute(data, column="city",
                unique_value="NYC",
                new_level=0.3)
9
задан Anthony Mastrean 14 December 2012 в 03:56
поделиться

3 ответа

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

2
ответ дан 3 November 2019 в 07:14
поделиться

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

        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();
    }

HTH, RiP

0
ответ дан 3 November 2019 в 07:14
поделиться

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

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

  1. Создать оболочку вокруг последовательного порта
  2. Дать оболочке интерфейс, возможно, IPort
  3. Передайте это в класс, который требует SerialPort
  4. Mock the 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), вы не можете провести его модульное тестирование. Оставьте это для интеграционных тестов.

3
ответ дан 3 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: