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();
}
4

1 に答える 1

11

複雑にしないでおく。

ネットワーク層を抽象化します。私は通常、次のようなインターフェイスを使用しますINetworkChannel

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

すべてを簡単にテストできるようになり、新しい非同期メソッドを使用するクラス またはSecureNetworkChannel使用するクラスを作成できます。SslStreamFastNetworkChannel

どのストリームが使用されているか、または使用しているかどうかなどの詳細TcpClientSocket、アプリケーションの残りの部分にとって重要ではありません。

編集

INetworkingChannel非常に明確な責任を持つクラスを取得したため、実装のテストも簡単です。実装をテストするために実装への接続を作成します。TcpListenerポートをリッスンして0、OS が空きポートを割り当てられるようにします。

送受信を適切に処理し、接続が閉じられた/切断されたときに適切なクリーンアップを行うようにします。

于 2011-12-16T12:33:08.057 に答える