我试图在自动化测试中使用Castle Windsor,步骤如下:
- 在每个测试中,
例如,我可能有15个测试,访问间接导致创建一个
然而,我现在正在编写一个名为
根据文档,Castle Windsor 3允许覆盖注册,但我只找到了一个示例:
- 在每个测试中,
Setup()
函数创建一个Windsor容器,并注册每个组件的默认实现。
- Test
函数通过方法 IWindsorContainer.Resolve<T>
访问组件,测试它们的行为。
- TearDown()
函数处理Windsor容器(以及任何创建的组件)的清理工作。例如,我可能有15个测试,访问间接导致创建一个
IMediaPlayerProxyFactory
组件。 SetUp
函数注册了一个足够好的实现IMediaPlayerProxyFactory
,因此我不必在这15个测试中都注册一遍。然而,我现在正在编写一个名为
Test_MediaPlayerProxyFactoryThrowsException
的测试用例,确认我的系统是否优雅地处理来自IMediaPlayerProxyFactory
组件的错误。在测试方法中,我已经创建了一个特殊的模拟实现,现在我想将其注入到框架中:this.WindsorContainer.Register(
Component.For<IMediaPlayerProxyFactory>()
.Instance(mockMediaPlayerProxyFactory)
);
然而,Windsor抛出Castle.MicroKernel.ComponentRegistrationException
异常,错误信息为"There is already a component with that name."
我是否有办法使我的mockMediaPlayerProxyFactory
成为IMediaPlayerProxyFactory
的默认实例,丢弃已经注册的组件?
根据文档,Castle Windsor 3允许覆盖注册,但我只找到了一个示例:
Container.Register(
Classes.FromThisAssembly()
.BasedOn<IEmptyService>()
.WithService.Base()
.ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
ConfigureFor
是 BasedOnDescriptor
类的一个方法。在我的情况下,我没有使用 FromDescriptor
或者 BasedOnDescriptor
。
.IsDefault
方法,除此之外非常好! - bevacquaIsFallback()
似乎无法与Func
一起使用。例如,将IsFallback()
添加到container.Register(Component.For<Func<ICat>>().UsingFactoryMethod<Func<ICat>>(() => () => new Cat()));
中,如果稍后覆盖此注册,则不会防止重复键错误。但是,将IsDefault().Named(Guid.New.ToString())
添加到覆盖注册中可以解决问题。 - bugged87