2

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.SetCurrentWindowViewModelBのインスタンスでメソッドが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.DoSomethingViewModelBをインスタンス化するための呼び出しを実行すると、ViewModelBが

System.Reflection.ReflectionTypeLoadException:要求されたタイプの1つ以上をロードできません。詳細については、LoaderExceptionsプロパティを取得してください。

これは、ViewModelBコンストラクターが呼び出すためですCompositionInitializer.SatisfyImports(this)が、私のテストプロジェクトでは、MEFコンテナーが設定されていません。

そのようなシナリオをテストするのがどのように最善であるかについて何か考えはありますか?または、コードを再構築してテスト可能にする方法はありますか?

4

1 に答える 1

1

あなたができる唯一のことは、[インポート]されたプロパティをパブリックセッターでパブリックに変更し、インスタンスを直接設定することだと思います。単体テストで MEF について心配する必要はありません。

このスレッドは、もう少し深く掘り下げます。

于 2012-12-13T22:14:51.687 に答える