我试图在我的自动化测试中使用Castle Windsor,如下所示:
每次测试:
Setup()函数创建一个Windsor容器,注册每个组件的默认实现Test函数通过该方法访问组件IWindsorContainer.Resolve<T>,并测试它们的行为TearDown()函数处理Windsor容器(以及任何创建的组件)例如,我可能有15个测试访问组件,这些组件间接导致组件的创建IMediaPlayerProxyFactory.该SetUp函数注册了一个足够好的实现IMediaPlayerProxyFactory,所以我没有在15个测试中的每个测试中注册这个的维护负担.
但是,我现在正在编写测试Test_MediaPlayerProxyFactoryThrowsException,确认我的系统优雅地处理IMediaPlayerProxyFactory组件中的错误.在测试方法中,我创建了我的特殊模拟实现,现在我想将它注入到框架中:
this.WindsorContainer.Register(
Component.For<IMediaPlayerProxyFactory>()
.Instance(mockMediaPlayerProxyFactory)
);
Run Code Online (Sandbox Code Playgroud)
但温莎抛出一条Castle.MicroKernel.ComponentRegistrationException消息,"已经有一个有这个名字的组件."
有什么方法可以让我mockMediaPlayerProxyFactory成为默认实例IMediaPlayerProxyFactory,丢弃已经注册的组件?
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IEmptyService>()
.WithService.Base()
.ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
Run Code Online (Sandbox Code Playgroud)
ConfigureFor是一种BasedOnDescriptor类的方法.在我的情况下,我没有使用FromDescriptor或BasedOnDescriptor.
我想在给定的windsor容器中重新定义(默认)实现.那是OverWrite的用途吗?但不起作用.
container.Register(
Component.For<IServiceOperationAuthorization>()
.OverWrite()
.Instance(_authorization)
);
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
欢呼,拉尔斯