4

Managed Extensibility Framework(MEF)を参照して、モックを使用してクリーンなテストを作成する方法を模索しています。

3つのプライベートインポートを持つエクスポートされたコンポーネントがあります。インポートされた各オブジェクト(フィールド)をモックする必要があります。CompositionContainerが、構成可能なパーツのインポートされたプライベートフィールドを設定するために派手なリフレクション戦術を使用していることを考えると、単体テストでも、コンテナーを使用してそれらのフィールド値を設定する必要があります。

テストしているコンポーネントのインポートを満たすために使用できるように、Rhino Mocksで作成した動的オブジェクトを有効なエクスポートとして受け入れるように実行時にコンテナーに指示するにはどうすればよいですか?

4

1 に答える 1

5

私の質問はここで答えられました。


こんにちはネイサン

ここにはいくつかの異なるオプションがあります。

  1. バッチを使用すると、AddExportedObjectメソッドを呼び出して、モックインスタンスをコンテナに追加できます。AddExportedObjectを使用すると、追加するインスタンスのコントラクトを指定できます。つまり、batch.AddExportedObject(mockLogger、typeof(ILogger));

  2. また、モックインスタンスを追加できるようにするカスタムエクスポートプロバイダーを作成します。このリンクをたどると、私が使用するいくつかのユーティリティがあります。http://pastie.org/467842。その中には、FakeExportDefinitionsとともにFakeExportProviderがあります。FakeExportDefinitionsは、インスタンスの関数を取ります。これは、インスタンスを渡すことも、モックを直接作成することもできることを意味します。

使用法を説明するためのサンプルコードを次に示します。

    protected override void Context()
    {
        MockCache = MockRepository.GenerateStub<ICache>();
        var metadata = new Dictionary<string, object> ()
        var cacheDefinition = new FakeInstanceExportDefinition(typeof(ICache), MockCache, metadata);
        FakeProvider = new FakeExportProvider(f => ((FakeInstanceExportDefinition)f).Instance);
        FakeProvider.AddExportDefinitions(cacheDefinition);
        CacheExport = FakeProvider.GetExport<ICache>();
    }

上記では、エクスポートプロバイダーに直接クエリを実行しています。ただし、私たちのコンテナでは、その構築時にエクスポートプロバイダーを渡すことができます。だからあなたはこれを行うことができます...

var container = new CompositionContainer(null、FakeProvider)。

HTHグレン

于 2009-05-04T17:43:01.437 に答える