7

これまでのところ、次のインターフェイスを作成しました。

  public interface IDirectoryInfoWrapper
  {
    public IFileInfoWrapper[] GetFiles(string searchPattern, SearchOption searchType);
    public IDirectoryInfoWrapper[] GetDirectories();
  }

DirectoryInfo を に置き換えるコードを調べてきましたIDirectoryInfoWrapper。私がこれを見つけるまで、すべてがうまくいっていました:

  // Check that the directory is valid
  DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
  if ( directoryInfo.Exists == false )
  {
    throw new ArgumentException
        ("Invalid IFileFinder.FindFiles Directory Path: " + argPath);
  }

コンストラクターをインターフェイスに配置しても意味がないため、次のコード行をどうすればよいでしょうか。

DirectoryInfo directoryInfo = new DirectoryInfo( argPath );
4

2 に答える 2

6

明らかな選択肢が 2 つあります。

  1. DirectoryInfoそこで独自のラッパー実装に置き換えます(理想的ではありません)
  2. インスタンスを作成できるファクトリを作成しIDirectoryInfoWrapperます。Create使用したい各コンストラクターのオーバーロードを使用して関数を作成できます。

つまり、新しいディレクトリ情報オブジェクトを作成する必要があるクラスにそのファクトリを注入するだけです。

また、ラッパー インターフェイスを変更して、そのExistsプロパティを公開することもできます。

編集:何かを単体テストするためにこれを行っている場合(可能性が高いようです)、Misko Heveryを読んでみてください。C# で演算子を使用するたびにnew、実行時に何かを挿入できないポイントがあります。newこれにより、最も些細なケース以外で何かを使用してテストすることが非常に困難になります。単純なデータ オブジェクトではないものについては、ほぼ常にファクトリを使用します。

編集II

構築をファクトリに委譲しているため、DirectoryInfo実際のコンストラクタを使用する場所は次のとおりです。

class Factory : IFactory 
{
  IDirectoryInfoWrapper Create(string arg)
  {
    var dirInfo = new DirectoryInfo(arg);
    var wrapper = new DirectoryInfoWrapper(dirInfo);
    return wrapper;
  }
}
于 2012-06-22T15:52:11.283 に答える
1

このリンクは、File クラスをモックする方法の例を示しています。DirectoryInfo についても同様に行う必要があります。単体テストのために C# でファイル システムをどのようにモックしますか?

于 2012-06-22T15:55:22.917 に答える