.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 クラスの設計にあることはわかっています。