То, что вы, по-моему, пытаетесь сделать, - это просто соединить несколько вещей в функцию. Используя ваш пример, давайте предположим, что 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)
http://en.wikipedia.org/wiki/COM_port_redirector содержит список некоторых бесплатных / открытых драйверов / перенаправителей виртуальных COM-портов, которые могут быть полезны для вашего тестирования!
Я успешно использовал нижеприведенное, но только для тестирования обработки данных и внутренних таймингов. Это не может справиться с закрытием / открытием самого 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
Похоже, вы хотите провести интеграционное тестирование, а не модульное тестирование?
Если вы имеете в виду модульное тестирование, вы могли бы:
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), вы не можете провести его модульное тестирование. Оставьте это для интеграционных тестов.