1

単体テストを作成しようとしているサードパーティのコンポーネントがあります。問題は、オブジェクトをモックできず、インターフェイスがないことです。

モックのために、コードを呼び出すインターフェイスとラッパー クラスを作成することにしました。メタ データを使用して Visual Studio によって生成されたクラス定義を調べたところ、いくつかのことに気付きました。

  • クラスには 2 つのコンストラクターがあります (1 つはパラメーターを受け取ります)。
  • クラスは IDisposable から継承します

私の質問は次のとおりです。

  1. 以下の私の実装は正しく見えますか?
  2. プロキシ クラスで IDisposable の実装を正しく処理しましたか?
  3. インターフェイスがコンストラクター定義をサポートしていないため、プロキシ クラスに 2 番目のコンストラクターが必要ですか? コードで依存性注入を使用していますが、DI フレームワークに 2 番目のコンストラクターを使用するように指示しない限り、実際には必要ないと思いますが、よくわかりません。

メタデータは次のようになります (縮小版):

public class PopClient : IDisposable
{
    public const int DefaultPort = 110;
    public const int DefaultSSLPort = 995;

    public PopClient();
    public PopClient(AddressFamily addressFamily);
    public bool HasTimeStamp { get; }
    public List<string> Capability();
    public void Connect(string host);
    protected override void GetServerGreeting();
}

メタデータに基づいて、私のインターフェイスは次のようになります (インターフェイス定義で無効なメソッド/プロパティ/アクセス修飾子を削除した後):

public interface IPopClient : IDisposable
{
    bool HasTimeStamp { get; }
    List<string> Capability();
    void Connect(string host);
    void ConnectSSL(string host);
}

インターフェイスに基づいて、ラッパー クラスを作成しました。

public class PopClientProxy : IPopClient
{
    private readonly Pop3 pop3;

    public PopClientProxy()
        this.pop3 = new Pop3();

    public PopClientProxy(AddressFamily addressFamily)
        this.pop3 = new Pop3(addressFamily);

    public bool HasTimeStamp
        get { return pop3.HasTimeStamp; }

    public List<string> Capability()
        return pop3.Capability();

    public void Connect(string host)
        pop3.Connect(host);

    public void Dispose()
    {
        if (pop3 != null)
            pop3.Dispose();
    }
}
4

1 に答える 1

0

プロキシは正常に見えます。それに基づいて、テストが扱っているインターフェイスの関連部分を簡単にモックできるはずです。

IDisposable実装については、使い捨てパターンの慣例を参照してください。この質問はそれについてです。

コンストラクターについては、それらは単にインターフェースの一部ではないため、プロキシの実装で複製する必要はありません。それが DI コンテナーで奇妙なコンストラクター ロジックにつながる場合は、構築を初期化から分離し、後者をインターフェイスに含めてみてください。

于 2012-09-10T21:34:07.060 に答える