私はアプリケーションライフタイム全体に存在する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でコンポーネントを削除できますか?
もちろんこれは機能します。しかし、これは多くの依存ソフトウェアプロジェクトで多くのコード変更を必要とするでしょう。私はホルダーオブジェクトを実際のものの代わりに容器に入れて解決策を見つけました。しかし、私はそれについて考えると、城は実際にユニットテストのためのIoCコンテナではないようですね。 – Antineutrino
私がここまで書いた単体テストについては、キャッスルはユニットテストのための完全なIoCコンテナでした。とにかく、登録されたエンティティをすべてクリアする必要があるのはなぜですか? – eouw0o83hf
各ユニットテストはそれ自身のモックを登録するためです。それらが削除されない場合、次の単体テストは誤ったモックを使用しています。したがって、すべてのコンポーネントを削除するIocテストフィクスチャのIDisposable.Disposeメソッドにコードがあります。 – Antineutrino