c# - 使用 UnityAutoMoqContainer 注册通用接口(interface)

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

我们在单元测试中使用 UnityAutoMoq 来模拟我们的大部分接口(interface),但我最近遇到了一种情况,我们想要使用测试框架来更完全地模拟实际行为(如果有帮助,称之为集成测试你接受我正在做的事情)。

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

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
}

正如您从上面看到的,我将通用接口(interface)注册到通用具体,然后根据注入(inject)工厂使用传入类型解析它(为简单起见省略了实际实现)。这适用于普通的 UnityContainer,返回预期的具体内容。 UnityAutoMoqContainer 返回一个模拟,完全绕过注入(inject)工厂。

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

最佳答案

我发现问题出在底层的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;
    }
}

底线是构建器策略发现接口(interface)未注册并拦截其创建。这是因为泛型类型定义不等于泛型类型本身。

我研究了最近更新的 AutoMoq,但它也有阻止注入(inject)工厂启动的拦截限制。

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

如果有人有推荐,请告诉我,否则我会考虑这个答案。

关于c# - 使用 UnityAutoMoqContainer 注册通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373972/

相关文章:

c# - 为什么Workflow卸载后不唤醒?

python - 如何通过运行单元测试引用我的设置文件?

c# - 如何根据 Moq 方法设置中的参数值返回两个不同的值?

c# - 使用Response.Filter和Response.Write测试Http模块

database - flask create_app 和 setUp unittest

C# Moq Entity Framework 6 数据上下文添加操作

c# - 从用户控件获取图像 - Silverlight

c# - 谁能解释 string.Join 连接的顺序?

C# 多源、不同线程、一个事件处理程序

c# - 调用静态方法的单元测试方法的模式或实践