ユニティ依存性注入フレームワークを使用するクラスでユニットテストを行っています。ServiceLocatorによるユニットテスト
これはnullを返します。 ServiceLocator.Current.GetInstance();
モックオブジェクトまたはオブジェクト自体を返すにはどうしたらいいですか?
ユニティ依存性注入フレームワークを使用するクラスでユニットテストを行っています。ServiceLocatorによるユニットテスト
これはnullを返します。 ServiceLocator.Current.GetInstance();
モックオブジェクトまたはオブジェクト自体を返すにはどうしたらいいですか?
MSDNにはhow to implement the service locator pattern with Unityというこの例があります。基本的には、サービスロケータオブジェクトをクラスのコンストラクタ引数として渡す必要があります。これにより、MockUnityResolver
を渡すことができ、単体テストで完全なコントロールが可能になります。
[TestMethod]
public void InitCallsRunOnNewsController()
{
MockUnityResolver container = new MockUnityResolver();
var controller = new MockNewsController();
container.Bag.Add(typeof(INewsController), controller);
var newsModule = new NewsModule(container);
newsModule.Initialize();
Assert.IsTrue(controller.RunCalled);
}
コア "DIインテグレーション"コードをテストしていますか?そうでない場合は、通常のコードをDIフレームワークとやりとりすることは決してありません。
通常、依存関係はコンストラクタインジェクションを介して注入され、テスト時にはその代わりにそれらのコンストラクタ依存関係としてモックオブジェクトを提供することができます。例:
上記のコードを使用すると、単純にIBarをモックしてFooコンストラクタに渡すことができます。
貧弱な人の注射を利用することができます。サービス・ロケータから依存関係を取得し、それらの依存関係をパラメータとして受け取る「実際の」コンストラクタに転送するデフォルトのコンストラクタを作成します。それは生産状況を処理します。
問題のクラスをテストするときは、デフォルトのものをまったく迂回して、 "真の"コンストラクタに依存関係の擬似/模擬バージョンを渡します。
いつでもContainer + ServiceLocatorをセットアップし、実際に必要な依存関係を満たすことができます(たとえば、mockを登録するなど)。コンテナ/ロケータの設定方法については、コード例4を参照してください。
http://blogs.msdn.com/b/miah/archive/2009/05/12/servicelocator-and-unity-be-careful.aspx