我知道简短的答案是模拟,但任何示例都可以。我需要能够测试以下内容:
- 连接/断开连接
- 按设置的时间间隔接收数据
- 暂停数据传输,导致我的类尝试重新连接
- 测试事件是否按预期触发。
作为一个开始,我考虑定义一个接口,该接口将使用流,这将使我能够让我的类连接到任何流,我可以更好地控制它而不是串行端口,并且可以以编程方式执行。如果有更好的想法,我将非常感激。
我知道简短的答案是模拟,但任何示例都可以。我需要能够测试以下内容:
作为一个开始,我考虑定义一个接口,该接口将使用流,这将使我能够让我的类连接到任何流,我可以更好地控制它而不是串行端口,并且可以以编程方式执行。如果有更好的想法,我将非常感激。
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包装器),你无法对其进行单元测试。你需要将其留给集成测试。
http://en.wikipedia.org/wiki/COM_port_redirector 列出了一些免费/开源的虚拟串口驱动程序/重定向器,这对您的测试非常有帮助!
我已经成功使用了以下内容,但仅用于测试数据处理和内部时间。这无法处理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();
}
HTH, RiP