相关疑难解决方法(0)

在Castle Windsor 3中,覆盖单元测试中的现有组件注册

我试图在我的自动化测试中使用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,丢弃已经注册的组件?


根据文档,Castle Windsor 3允许注册覆盖,但我只能找到一个例子:

Container.Register(
    Classes.FromThisAssembly()
        .BasedOn<IEmptyService>()
        .WithService.Base()
        .ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
Run Code Online (Sandbox Code Playgroud)

ConfigureFor是一种BasedOnDescriptor类的方法.在我的情况下,我没有使用FromDescriptorBasedOnDescriptor.

unit-testing castle-windsor

27
推荐指数
1
解决办法
2万
查看次数

如何使用城堡windsor覆盖组件?

我想在给定的windsor容器中重新定义(默认)实现.那是OverWrite的用途吗?但不起作用.

container.Register(
                    Component.For<IServiceOperationAuthorization>()
                            .OverWrite()
                            .Instance(_authorization)
                    );
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

欢呼,拉尔斯

castle-windsor castle ioc-container inversion-of-control

16
推荐指数
3
解决办法
1万
查看次数