2

私はここで次のような議論についてさまざまな質問を読みました

TCPサーバーをどのように単体テストしますか?それも価値がありますか?

およびその他のより具体的な質問

誰かが.NETでSocketクラスを正常にモックしましたか?

サイのモック:偽のソケットを作成する方法は?

とにかく質問を投稿したいと思います。

抽象ネットワーク層を設計する必要があります。コンシューマーコードを特定の実装に依存しないようにすることは抽象的であり、最後になりましたが、偽物で完全にテスト可能である必要があります。

クラスをモックする必要はSocketなく、より高いレベルの抽象化を定義してモックすることになりました。

interface INetworkLayer {
  void OnConnect(Stream netwokStream);
  void OnException(Exception e); // doubts on this  
}

誰かがこれに近い何かをして、観察、コメントを提供したり、正しい方向にどのように見えるかを説明したりしましたか?

4

1 に答える 1

2

あなたが求めているのは、「テスト容易性の向上」ではなく、単にネットワーク経由で送信するコードを「テスト」することだと思います。

私の経験から、ネットワーク経由で送信されるものをテストする興味深いものは 2 つだけです。

  1. アプリケーションは正しいメッセージを送信していますか?
  2. このメッセージをネットワーク経由で送信できますか?

たとえば、アプリケーションが (アプリケーション レベルの) メッセージを別のサーバーに送信できるとします。次のようなインターフェイスを定義できます。



    public interface MessagePort {
        void Send(Message message, ServerName to);
    }

ここで、Message はアプリケーションが送信するメッセージ、ServerName はアプリケーション レベルでメッセージのターゲットに名前を付ける方法を表すクラスです。簡単にするために、ServerName は、構成、DNS、またはその他によってサーバーのアドレスにマップできる単純な文字列にすることができます。選んで。

MockMessagePort を実装してメッセージを単純なリストに格納し、アプリケーションが実際に正しいメッセージを送信しているかどうかをテストできます。(質問1。)

その後、ループバックを使用して、ネットワークを介したメッセージの実際の送信を実装できます。この例については、ボブおじさんの「クラフトマン」の記事を読みたいと思うかもしれません。

http://www.objectmentor.com/resources/publishedArticles.html、トピック「職人」。TCP サーバーのテスト主導の実装は、シリーズのいくつかのエピソードから離れていますが、最初から読む必要があります。

さらに興味深い抽象化は、メッセージ宛先への「チャネル」の抽象化です。



    public interface MessageChannel {
        void Send(Message message);
    }

実装が宛先について知っている場所。もちろん、この場合、宛先「ServerName」からチャネルを提供する別のオブジェクトがあります。

ネットワーク機能の抽象モデルが本当に必要な場合は、次のようにします。

  1. 2 つの異なるネットワーク ライブラリを検索してみてください。
  2. 各ライブラリを使用して、同じアプリを 2 回作成します。
  3. アプリを因数分解します。アプリケーション コードは同じである必要があり、ネットワーク部分は異なる必要があります。それらはインターフェイスによって分離されます。これはあなたが探しているインターフェースです。

しかし、正直なところ、それがあなたのアプリケーションに多くをもたらすとは思えません。

于 2013-02-16T23:35:29.750 に答える