2011-12-16 4 views
4

私は以下のコードをユニットテストしたいと思います。私はMSTestで働いており、Microsoft MolesRhinoMocksを学ぼうとしました。しかし、私はどちらも私を助けないようにすることはできませんでした。私はコードを大幅に変更して、よりテスト可能なインターフェイスを使用することができますが、TcpClient、NetworkStream、StreamWriter、およびStreamReaderをカプセル化するインターフェイスと実装をコーディングする必要があります。テストネットワーク接続をどのようにユニット化するのですか?

私はすでにこのための統合テストを書いており、モルズに堪能な人は、コードを変更することなくこれを簡単に行うことができます。

using (TcpClient tcpClient = new TcpClient(hostName, port)) 
using (NetworkStream stream = tcpClient.GetStream()) 
using (StreamWriter writer = new StreamWriter(stream)) 
using (StreamReader reader = new StreamReader(stream)) 
{ 
    writer.AutoFlush = true; 
    writer.Write(message); 
    return reader.ReadLine(); 
} 
+3

「ユニットテスト」を試してみる価値はありません。このメソッドが使っている部分を嘲笑した場合は、本質的にプロパティセッター、 'writer'へのメソッド呼び出し、' reader'へのメソッド呼び出しをチェックすることになります。ここでの行動はあまりありません。テストするのも面白いことではありません。このメソッドを使用するクラスをテストするのは興味深いので、このクラスはインターフェイスを実装し、それを呼び出すコンポーネントをテストするようにしています。 –

+0

@ MerlynMorgan-Graham私は同意する –

答えて

10

簡単にしてください。

抽象的なネットワークレイヤー。

public interface INetworkChannel : IDisposable 
{ 
    void Connect(IPEndPoint remoteEndPoint); 
    void Send(byte[] buffer, int offset, int count); 

    public event EventHandler Disconnected; 
    public event EventHandler<ReceivedEventArgs> Received; 
} 

それはすべてのものをテストすることを容易にし、新しい非同期メソッドを使用していますSslStreamFastNetworkChannelを使用していますSecureNetworkChannelクラスを作成することができます。私は通常、次のようになりますINetworkChannelのようなものと呼ばれるインタフェースを使用しています。

ストリームが使用されているか、またはTcpClientまたはSocketを使用しているかのような詳細は、アプリケーションの他の部分では問題にならないはずです。

編集

テストINetworkingChannel実装では、あなたが今、非常に明確な責任を持つクラスを持って、あまりにもするので簡単です。私はそれらをテストする実装に接続を作成します。 TcpListenerがポート0をリッスンして、OSに空きポートを割り当てることを許可します。

ちょうどそれが送受信を適切に処理し、接続が切断されたときに適切にクリーンアップすることを確認します。

+0

+1;このようなことを模倣するならば、私は明らかに関与するクラスの多くとの単純なインターフェースが必要です。基本的にファサードパターン(ここでやったように)。私はこのインターフェースのデザインが好きです。なぜなら実装すべき勇気はほとんどなく、その背後にはアプリカスタムのロジックがほとんどないからです。私が持っている唯一の懸念は、これは「IDisposible」ではないということです。それはすべきでしょうか? –

+0

@ MerlynMorgan-Graham:あなたは正しいです。ソケットは、特にサーバーに配置する必要があります。また、 'Socket'オブジェクトは再利用できないので、' Close'メソッドは本当に必要ありません。 – jgauffin

+0

右、とても素敵な簡素化! – sll

関連する問題