StructureMap 2.6.4.0 を使用しています。これを使用する主な目的は、テストを簡素化することです。StructureMap のドキュメント ( here ) によると、一時的なモック インジェクション (ObjectFactory.Inject<>()) のための優れた機能があります。
間違っている場合は訂正してください。ただし、その機能についての私の理解は次のとおりです。
- コンテナ構成のコードを 1 か所にまとめ、すべての「実際の」実装をそれらのインターフェイスにマッピングします。
- すべてのテストを実行する前に、アプリケーションと同じコードに基づいて ObjectFactory を初期化します。
- テストで「実際の」実装を「テスト」実装に置き換える必要がある場合、ObjectFactory の Inject メソッドで「テスト」実装を注入します。
- 元のマッピングを復元し、注入されたモックを削除するには、ResetDefaults() を呼び出す必要があります。
そして私の問題は4番目のステップにあります。
これが私の問題を示すコード例です。
public interface IValueProvider
{
string GetValue();
}
public class ValueProvider : IValueProvider
{
public string GetValue()
{
return "Value provider";
}
}
public class TestValueProvider : IValueProvider
{
public string GetValue()
{
return "Test value provider";
}
}
class Program
{
static void Main(string[] args)
{
ObjectFactory.Initialize(x => x.For<IValueProvider>().Use<ValueProvider>());
var valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see expected "Value provider"
ObjectFactory.Inject<IValueProvider>(new TestValueProvider());
valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see expected "Test value provider"
ObjectFactory.ResetDefaults();
valueProvider = ObjectFactory.GetInstance<IValueProvider>();
Console.WriteLine(valueProvider.GetValue());
// I will see NOT expected "Test value provider".
// Doesn't ResetDefaults() have to restore a ValueProvider implementation?
}
}
だから、誰かが私が間違っている場所を教えてもらえますか? それとも、StructureMap のバグでしょうか?