gpt4 book ai didi

unit-testing - 在 CaSTLe Windsor 3 中,覆盖单元测试中的现有组件注册

转载 作者:行者123 更新时间:2023-12-03 09:40:31 26 4
gpt4 key购买 nike

我试图在我的自动化测试中使用 CaSTLe Windsor,如下所示:

在每次测试中:

  • Setup()函数创建一个 Windsor 容器,注册每个组件的默认实现
  • Test函数通过 IWindsorContainer.Resolve<T> 方法访问组件,并测试他们的行为
  • TearDown()函数处理 Windsor 容器(以及任何创建的组件)

  • 例如,我可能有 15 个测试访问组件,这些测试间接导致创建 IMediaPlayerProxyFactory。零件。 SetUp函数注册了一个足够好的实现 IMediaPlayerProxyFactory ,所以我没有在 15 个测试中注册这个的维护负担。

    但是,我现在正在写一个测试 Test_MediaPlayerProxyFactoryThrowsException ,确认我的系统优雅地处理来自 IMediaPlayerProxyFactory 的错误零件。在测试方法中,我创建了我的特殊模拟实现,现在我想将它注入(inject)到框架中:

    this.WindsorContainer.Register(
    Component.For<IMediaPlayerProxyFactory>()
    .Instance(mockMediaPlayerProxyFactory)
    );

    但是温莎抛出了 Castle.MicroKernel.ComponentRegistrationException ,并显示消息“已存在具有该名称的组件”。

    有什么方法可以让我的 mockMediaPlayerProxyFactory成为 IMediaPlayerProxyFactory 的默认实例,丢弃已经注册的组件?

    根据 documentation ,CaSTLe Windsor 3 允许注册覆盖,但我只能找到一个示例:

    Container.Register(
    Classes.FromThisAssembly()
    .BasedOn<IEmptyService>()
    .WithService.Base()
    .ConfigureFor<EmptyServiceA>(c => c.IsDefault()));
    ConfigureForBasedOnDescriptor 的一种方法类(class)。在我的情况下,我没有使用 FromDescriptorBasedOnDescriptor .

    最佳答案

    要创建覆盖实例,您必须做两件事:

  • 为其分配一个唯一的名称
  • 调用IsDefault方法

  • 因此,要使示例正常工作:

    this.WindsorContainer.Register(
    Component.For<IMediaPlayerProxyFactory>()
    .Instance(mockMediaPlayerProxyFactory)
    .IsDefault()
    .Named("OverridingFactory")
    );

    因为我计划在许多测试中使用这个覆盖模式,所以我创建了自己的扩展方法:

    public static class TestWindsorExtensions
    {
    public static ComponentRegistration<T> OverridesExistingRegistration<T>(this ComponentRegistration<T> componentRegistration) where T : class
    {
    return componentRegistration
    .Named(Guid.NewGuid().ToString())
    .IsDefault();
    }
    }

    现在示例可以简化为:

    this.WindsorContainer.Register(
    Component.For<IMediaPlayerProxyFactory>()
    .Instance(mockMediaPlayerProxyFactory)
    .OverridesExistingRegistration()
    );

    稍后编辑

    3.1 版引入了 IsFallback方法。如果我用 IsFallback 注册所有初始组件,那么任何新的注册都会自动覆盖这些初始注册。如果当时功能可用,我会走这条路。

    https://github.com/castleproject/Windsor/blob/master/docs/whats-new-3.1.md#fallback-components

    关于unit-testing - 在 CaSTLe Windsor 3 中,覆盖单元测试中的现有组件注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253388/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com