2012-02-29 5 views
8

私はアプリケーションライフタイム全体に存在するIWindsorContanerを持っています。単体テストの場合、型の下にモック/スタブなどを登録することができます。テストが終了し、フィクスチャが配置されると、テスト用の登録されたコンポーネントは、「Unregister」と呼ばれる自己作成メソッドで削除されます。キャッスル3.0のコンポーネントはどのように削除されますか?

今、私は最新のCastleバージョン3.0にアップデートしたいと思います。 3.0リリースによると、IKernel.RemoveComponentメソッドが削除されているため

public void Unregister(string contextName, string registrationName) 
{ 
    IWindsorContainer context = GetOrCreateContext(contextName); 
    context.Kernel.RemoveComponent(registrationName); 
} 

のようなものは、もはや不可能です指摘しています。これを修正するための説明は、実際には十分ではありません(「IHandlerSelectorsを活用しよう」)。

私はユニットテストのために使用する治具の簡略化されたバージョン:

public sealed class DependencyInjectionFixture : IDisposable 
{ 
    private Stack<Type> registeredTypes = new Stack<Type>(); 

    // Registering of mocks/stubs, etc 
    public void RegisterSingleton<T>(T singleton, string objectName) 
    { 
    registeredTypes.Push(typeof(T)); 

    IWindsorContainer context = GetOrCreateContext(contextName); 

    context.Register(Component.For(typeof(T)) 
           .Named(objectName) 
           .Instance(singleton) 
           .LifeStyle.Singleton); 
    } 

    // Called when tests ends 
    public void Dispose() 
    { 
    IWindsorContainer context = GetOrCreateContext(contextName); 

    while (registeredTypes.Count > 0) 
     context.Kernel.RemoveComponent(CSApplicationContext.GetRegistrationNameFor(registeredTypes.Pop())); 
    } 

}

Iキャッスル3.0でコンポーネントを削除できますか?

答えて

2

すべてのコンポーネントを削除するのではなく、新しいIWindsorContainerを作成して、それをGetOrCreateContextがチェックしているものにバインドしてください。それで、あなたはそれに縛られていない新鮮な新しい容器を持っていきます。

+2

もちろんこれは機能します。しかし、これは多くの依存ソフトウェアプロジェクトで多くのコード変更を必要とするでしょう。私はホルダーオブジェクトを実際のものの代わりに容器に入れて解決策を見つけました。しかし、私はそれについて考えると、城は実際にユニットテストのためのIoCコンテナではないようですね。 – Antineutrino

+0

私がここまで書いた単体テストについては、キャッスルはユニットテストのための完全なIoCコンテナでした。とにかく、登録されたエンティティをすべてクリアする必要があるのはなぜですか? – eouw0o83hf

+1

各ユニットテストはそれ自身のモックを登録するためです。それらが削除されない場合、次の単体テストは誤ったモックを使用しています。したがって、すべてのコンポーネントを削除するIocテストフィクスチャのIDisposable.Disposeメソッドにコードがあります。 – Antineutrino

関連する問題