繁体   English   中英

向UnityAutoMoqContainer注册通用接口

[英]Register Generic Interfaces with UnityAutoMoqContainer

我们使用UnityAutoMoq来模拟单元测试中的大多数接口,但是最近我遇到了一种情况,我们希望使用测试框架来更完全地模拟实际行为(如果可以帮助您接受什么,则称为集成测试)我正在做)。

我希望UnityAutoMoq允许我注册具体的映射,而不是允许UnityAutoMoqContainer推迟模拟接口。 这适用于我尝试过的除通用接口之外的所有内容。 如果您像我一样视觉,这是我正在尝试的片段:

public static void Register(IUnityContainer container)
{
    ...
    container.RegisterType(typeof(IService<>), typeof(TestFrameworkService<>),
        new HierarchicalLifetimeManager(), new InjectionFactory(Create));
    ...
}

private static object Create(IUnityContainer container, Type type, string name)
{
    var T = type.GetGenericArguments().Single();
    return new TestFrameworkService<T>();// For simplicity, pretend this works
}

从上面可以看到,我正在将通用接口注册到通用混凝土,然后根据注入工厂使用传入类型来解析它(为简单起见,省略了实际实现)。 这适用于普通的UnityContainer,返回预期的混凝土。 UnityAutoMoqContainer会返回一个模拟,而不是完全绕过注入工厂。

有没有人尝试过我想要完成的事情? 有任何想法吗?

我发现问题出在底层的BuilderStrategy中。 这是UnityAutoMoqBuilderStrategy的片段。

public override void PreBuildUp(IBuilderContext context)
{
    var type = context.OriginalBuildKey.Type;

    if (autoMoqContainer.Registrations.Any(r => r.RegisteredType == type))
            return;

    if (type.IsInterface || type.IsAbstract)
    {
        context.Existing = GetOrCreateMock(type);
        context.BuildComplete = true;
    }
}

最重要的是,构建器策略会看到未注册接口并拦截其创建。 这是因为通用类型定义本身并不等于通用类型。

我查看了最近更新的AutoMoq,但它受到相同的拦截限制,导致注射工厂无法启动。

供参考,这是我研究的自动模拟库:

如果有人提出建议,请让我知道,否则我会认为这是答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM