使用UnityAutoMoqContainer

时间:2017-06-05 17:01:05

标签: c# unit-testing moq unity-container automoq

我们使用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返回一个模拟,完全绕过注入工厂。

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

1 个答案:

答案 0 :(得分:0)

我发现问题出在底层的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,它最近更新了,但它受到相同的拦截限制,阻止了注射工厂的射击。

供参考,以下是我研究过的自动插件库:

如果有人有推荐,请告诉我,否则我会认为这是答案。