2

我们在单元测试中使用 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 而是返回一个模拟,完全绕过注入工厂。

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

4

1 回答 1

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,它是最近更新的,但它也存在阻止注入工厂触发的相同拦截限制。

作为参考,以下是我研究的自动模拟库:

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

于 2017-06-12T17:39:27.087 回答