2009-05-12 4 views
8

私は短い答えがモックだと知っていますが、どのような例も良いでしょう。私は、次をテストできるようにする必要があります。SerialPortに依存するクラスの単体テストを書くにはどうしたらいいですか?

  1. 接続/は
  2. イベントが発火している
  3. テストを再接続しようとするために私のクラスを引き起こして、設定された間隔でデータ伝送における
  4. 一時停止し、データを受信外し期待される。

はじめに、ストリームを使用するインターフェイスを定義することを考えていました。クラスをシリアルに接続するだけで、シリアルポートよりも優れたコントロールが可能でした。私はそれをプログラム的に行うことができます。誰かが良いアイデアを持っていれば、私は大いに感謝しています。

答えて

2

http://en.wikipedia.org/wiki/COM_port_redirectorには、いくつかのフリー/オープンソース仮想COMポートドライバ/リダイレクタが記載されています。これはテストに役立ちます!

+0

ありがとう、クルラム、私はすでにうまく動作していますが、手動でポートの動作をテストする必要がある仮想シリアルドライバを手に入れました。私は「バディ」ポートを開設してデータを送信することを自動化することができましたが、私はむしろよりクリーンな方法で資金を調達したいと考えていました。私があなたの提案を誤解していない限り。 –

0

私は以下を成功裏に使用しましたが、データの処理と内部タイミングをテストするためにのみ使用しました。これは、SerialClass自体を閉じる/開くTestingClassに対処することはできません。あなたが統合テストではなく、ユニットテストを実行するように

3

が鳴り

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:

 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 
      } 
     } 

あなたはユニットテストを意味する場合は、可能性:

  1. おそらくIPORT
  2. がSERIALPORT
  3. を必要とするクラスにこれを渡し、ラッパーにインターフェースを与えるシリアルポート
  4. のラッパーを作成します。
  5. モック

で渡され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クラスをテストできます。 Unfortinatly(SerialPortラッパーなどの)フレームワークに近づくと、単体テストできません。統合テストに任せておく必要があります。

関連する問題