如何为一个依赖于SerialPort的类编写单元测试?

11

我知道简短的答案是模拟,但任何示例都可以。我需要能够测试以下内容:

  1. 连接/断开连接
  2. 按设置的时间间隔接收数据
  3. 暂停数据传输,导致我的类尝试重新连接
  4. 测试事件是否按预期触发。

作为一个开始,我考虑定义一个接口,该接口将使用流,这将使我能够让我的类连接到任何流,我可以更好地控制它而不是串行端口,并且可以以编程方式执行。如果有更好的想法,我将非常感激。

3个回答

5
听起来你想进行集成测试而不是单元测试?
如果你指的是单元测试,你可以:
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包装器),你无法对其进行单元测试。你需要将其留给集成测试。


3

谢谢Khurram,我已经有一个虚拟串行驱动程序了,它工作得很好,但需要我手动测试我的端口的行为。虽然我可以自动打开“伙伴”端口并发送数据,但我更愿意找到一种更清洁的方法来做到这一点。除非我误解了你的建议。 - Stigo

0

我已经成功使用了以下内容,但仅用于测试数据处理和内部时间。这无法处理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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接