7

.Net System.IO クラスへの呼び出しを模擬するユニット テスト可能なコードを作成したいので、ファイル システムに依存するのではなく、実際にユニット テストを実行できます。SystemWrapperクラスを使用して、BCL クラスをラップしています。

ファイルが存在するかどうかを確認するための簡単な例を取得しようとしています。

私が抱えている問題は、( StructureMapを介して) 依存関係をインスタンス化するには、渡すコンストラクターパラメーターを知る必要があるため、クラスに依存関係を注入しても機能しないことです。これは、その時点では使用できず、デフォルトのコンストラクターもありません。

サンプルコード:

// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);

// using service locator (anti-pattern?!) since it can't be 
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
    new ExplicitArguments(new Dictionary<string, object>
    {
        {"fileName", filename}
    }));

Console.WriteLine("File exists? {0}",  fileInfoWrap.Exists); 

私が気に入らないのは、依存関係が注入されていないことです。ObjectFactory はここにあるべきではありません (ただし、これを作成する他の方法はありません)。ExplicitArguments は面倒で、argument-name はマジック ストリングです。

これを機能させるには、StructureMap構成クラスは、使用するコンストラクターを明示的に知る必要があります(StructureMapを使い始めたばかりなので、これは正しい設定方法ではない可能性があります):

ObjectFactory.Initialize(x =>
{
    x.Scan(scan =>
    {
        scan.AssembliesFromPath(".");
        scan.RegisterConcreteTypesAgainstTheFirstInterface();
        scan.WithDefaultConventions();
    });

    // use the correct constructor (string instead of FileInfo)
    x.SelectConstructor(() => new FileInfoWrap(null as string));

    // setting the value of the constructor
    x.For<IFileInfoWrap>()
        .Use<FileInfoWrap>()
        .Ctor<string>("fileName")
        .Is(@".");
});

System.IO クラスに対してテスト可能なコードを作成するためのより良い解決策を見つけた人はいますか? 問題の一部が System.IO クラスの設計にあることはわかっています。

4

1 に答える 1

5

私が使用して非常に成功したアプローチSystem.IOは、FCL の他の部分で見つかった型に対して独自のプロキシ型を展開することです。たとえば、依存関係を取りたいとしSystem.IO.Fileます。というライブラリを作成しSystem.IO.Proxies、具象型Fileとインターフェイスを追加しますIFile。インターフェイスIFileは、私が必要とするすべてのメンバーと同等のメンバーを公開System.IO.Fileし、具象型は、メソッド呼び出しを に転送する以外に何もしないことで、これらのメンバーを実装しSystem.IO.Fileます。System.IO.Proxies単体テストとコード カバレッジから除外されます。私の使用するアセンブリでは、依存関係のみを取得します。System.IO.Proxies具体的には、依存関係のみを取得しIFileます。このようにして、この依存関係を簡単に模倣し、使用するアセンブリの 100% のコード カバレッジを達成できます。

(これは、以前の質問に対する私のより一般的な回答の調整版であることに注意してください。)

于 2012-01-07T13:17:42.533 に答える