MEFを使用してオブジェクトを一緒に構成していますが、MEFコンテナーにエクスポートされないが、MEFによってオブジェクトインスタンスがプロパティセッターに注入されることに依存している一部のクラスをテストするときに問題が発生しました。
たとえば、次の2つのビューモデルについて考えてみます。
public class ViewModelA
{
[Import]
internal IAdmin AdminService
{
get;
private set;
}
public ViewModelA()
{
CompositionInitializer.SatisfyImports(this);
}
//constructor for testing
internal ViewModelA(IAdmin adminService)
{
this.AdminService = adminService;
}
public void DoSomething()
{
this.AdminService.SetCurrentWindow(new ViewModelB());
}
}
public class ViewModelB
{
[Import]
internal IAdmin AdminService
{
get;
private set;
}
[Import]
internal IAnotherService AnotherServiceService
{
get;
private set;
}
public ViewModelB()
{
CompositionInitializer.SatisfyImports(this);
}
public void DoAnotherThing()
{
//Does something with the properties injected via MEF
}
}
これらのクラスはMEFコンテナーにエクスポートされないためCompositionInitializer.SatisfyImports(this)
、依存関係のインポートを強制するために呼び出しに依存しています。
DoSomethingの呼び出しをチェックするViewModelAのテストを作成し、IAdmin.SetCurrentWindow
ViewModelBのインスタンスでメソッドが1回呼び出されるようにします。これを満たすために、IAdminを引数として取るViewModelAのコンストラクターオーバーロードを作成し、MoqとSilverlightユニットテストフレームワークを使用して次のテストも作成しました。
[TestMethod]
public void DoSomethingStandard_CallsSetCurrentWindowWithViewModelB()
{
var adminServiceMock = new Mock<IAdmin>();
var vmA = new ViewModelA(adminServiceMock.Object);
vmA.DoSomething();
adminServiceMock.Verify(ad => ad.SetCurrentWindow(It.IsAny<ViewModelB>()), Times.Exactly((1)));
}
私の問題は、テストがViewModelA.DoSomething
ViewModelBをインスタンス化するための呼び出しを実行すると、ViewModelBが
System.Reflection.ReflectionTypeLoadException:要求されたタイプの1つ以上をロードできません。詳細については、LoaderExceptionsプロパティを取得してください。
これは、ViewModelBコンストラクターが呼び出すためですCompositionInitializer.SatisfyImports(this)
が、私のテストプロジェクトでは、MEFコンテナーが設定されていません。
そのようなシナリオをテストするのがどのように最善であるかについて何か考えはありますか?または、コードを再構築してテスト可能にする方法はありますか?