2012-04-26 7 views
1

私は現在UnityをMOQで使用してWCFのユニットテストを行っています。アプリケーションのコードでは、私は以下の持っている:アプリケーションのapp.configをでMicrosoft Unity - 実行時に登録されたタイプを変更することはできますか?

private void MyMethod() 
{ 
..... 
..... 
    _proxy = new UnityContainer().LoadConfiguration().Resolve<IMyInterface>(); 
..... 
} 

、私は次のようしている:

ユニットテストのapp.configをで
<container> 
    <register type="IMyInterface" mapTo="MyActualObject" /> 
</container> 

、私は私のモックとのこと置き換えますプロキシのオブジェクト実装。

<container> 
    <register type="IMyInterface" mapTo="MyMockObject" /> 
</container> 

これはすべて問題なく動作します。しかし、私がさらにやりたいことは、特定のテストのためです。私はMyMockObjectを別のモックオブジェクト実装に置き換えたいと思います。

実行時に登録されたタイプを変更することはできますか?実行時にアプリケーションの設定を変更しようとしましたが、変更を検出できませんでした。

Configuration appConfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var section = (UnityConfigurationSection)appConfig.GetSection("unity"); 
section.Containers[0].Registrations[0].MapToName = "AnotherMockObject"; 
appConfig.Save(); 

ありがとう!!

+0

ため

IUnityContainer container = new UnityContainer(); container.LoadConfiguration(); container.RegisterType<IMyInterface, AnotherMockObject>(); // use AnotherMockObject _proxy = Resolve<IMyInterface>(); 

ドキュメント:このような何かを試してみてください。 ConfigurationManager.RefreshSection( "unity")を使用して設定がキャッシュされないように、セクションをリフレッシュするだけでした。しかし、これが私が必要とするものを達成する唯一の方法ですか? –

答えて

1

はい可能です。

何度でもUnityを設定できます。矛盾がある場合、最新の定義が勝ちます。

ランタイムを変更する場合は、設定ファイルの代わりに流暢なAPIを使用します。実行時に設定ファイルを変更するとうまくいくように見えますRegistering Types and Type Mappings

+0

しかし、コンテナを初期化するコードは、単体テストではなくアプリケーションコード内にあります。単体テストそのものの型を変更したいのですが、コンテナのRegisterTypeを実行すると、すべてのコンテナに同じ変更が適用されるとは思いません。 –

+1

アプリケーションがUnityを正しく使用していないようです。すべてのオブジェクトを解決する単一の「ルート」ユニティインスタンスが存在する必要があります。注入されているクラスは、Unityを作成してはいけません(あるいは、それを意識しなくてもよい)。彼らはコンストラクタやプロパティの注入を介して依存関係を取得する必要があります。 – ErnieL

+0

あなたは何を意味しているのか教えていただけますか?そして、単体テストはどのように型のコントロールを持っていますか? –

関連する問題