Ja próbuje użyć zamku Windsor w moich zautomatyzowanych testów tak:w zamku Windsor 3, zastąpić istniejący rejestracji komponentu w badanej jednostki
Na każdym teście:
- Funkcja
Setup()
tworzy pojemnik Windsor, rejestracji domyślne implementacje każdego składnika - The
Test
funkcji dostępu komponentów metodąIWindsorContainer.Resolve<T>
, a testy ich zachowanie TearDown()
unieszkodliwia funkcyjne pojemnika Windsor (i wszelkie utworzone składniki)
Na przykład, mogę mieć 15 testów, które uzyskuje dostęp elementów pośrednio prowadzi do utworzenia z komponentu IMediaPlayerProxyFactory
. Funkcja SetUp
rejestruje wystarczająco dobrą implementację IMediaPlayerProxyFactory
, więc nie mam ciężaru konserwacyjnego związanego z rejestracją tego w każdym z 15 testów.
Jednak teraz piszę test Test_MediaPlayerProxyFactoryThrowsException
, potwierdzając, że mój system elegancko obsługuje błąd z komponentu IMediaPlayerProxyFactory
. W metodzie badania stworzyłem moją szczególną realizację makiety, a teraz chcę, aby wprowadzić go w ramy:
this.WindsorContainer.Register(
Component.For<IMediaPlayerProxyFactory>()
.Instance(mockMediaPlayerProxyFactory)
);
Ale Windsor rzuca Castle.MicroKernel.ComponentRegistrationException
z komunikatem „Jest już komponent o tej nazwie. "
Czy jest jakiś sposób, aby ustawić mockMediaPlayerProxyFactory
jako domyślną instancję dla IMediaPlayerProxyFactory
, odrzucając komponent, który jest już zarejestrowany?
Według documentation, Windsor Castle 3 pozwala na zadajnikami rejestracyjnych, ale udało mi się znaleźć tylko jeden przykład:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IEmptyService>()
.WithService.Base()
.ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
ConfigureFor
jest metodą klasy BasedOnDescriptor
. W moim przypadku nie używam FromDescriptor
ani BasedOnDescriptor
.
Nazywanie i wywoływanie metody '.IsDefault' nie są wymagane w rzeczywistej implementacji, poza tym, bardzo ładne! – bevacqua
Dziękujemy za zaktualizowanie odpowiedzi. –