2012-02-29 11 views
8

Mam IWindsorContaner, który istnieje przez cały okres użytkowania aplikacji. W przypadku Unittestów możliwe jest zarejestrowanie mocks/stubów itp. Pod ich typem. Po zakończeniu testu i umieszczeniu urządzenia zarejestrowane komponenty do testu są usuwane za pomocą samodzielnie utworzonej metody o nazwie "Wyrejestruj".W jaki sposób komponenty są usuwane z Castle 3.0?

Teraz chcę zaktualizować do najnowszej wersji Castle, która jest 3.0. Według komunikatu 3.0 zauważa coś

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

nie jest już możliwe, ponieważ metoda IKernel.RemoveComponent został usunięty. Opis rozwiązania tego problemu nie jest wystarczający ("Spróbuj użyć IHandlerSelectors.").

Uproszczona wersja urządzenia używać do unittests:

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())); 
    } 

}

Jak mogę usunąć elementy z zamkiem 3.0?

Odpowiedz

2

Zamiast próbować usunąć wszystkie komponenty, po prostu utwórz nowe IWindsorContainer i połącz je z tym, co sprawdzane jest z GetOrCreateContext. Wtedy będziesz miał nowy, nowy pojemnik, który nie ma nic związanego z tym.

+2

Oczywiście to by działało. Ale wymagałoby to również wielu zmian kodu w wielu zależnych projektach oprogramowania. Znalazłem rozwiązanie polegające na umieszczeniu obiektu z pojemnikiem na pojemniku zamiast prawdziwego. Ale im więcej o tym myślę, Castle naprawdę nie wydaje się być właściwym pojemnikiem IoC do unittests, prawda? – Antineutrino

+0

Dla wszystkich testów jednostkowych, które napisałem w tym punkcie, Castle był dokładnie idealnym pojemnikiem IoC do testów jednostkowych. Dlaczego mimo wszystko trzeba wyczyścić wszystkie zarejestrowane podmioty? – eouw0o83hf

+1

Ponieważ każdy test jednostkowy rejestruje swoje własne drwiny. Jeśli nie zostaną usunięte, następny test jednostkowy będzie używał niewłaściwych prób. W kodzie IDisposable.Dispose znajduje się kod narzędzia Ioc, który usuwa wszystkie komponenty. – Antineutrino

Powiązane problemy