我们在单元测试中使用 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)工厂启动的拦截限制。
作为引用,以下是我研究的自动模拟库:
- https://github.com/thedersen/UnityAutoMoq
- https://github.com/rajgit31/UnityAutoMoq
- https://github.com/darrencauthon/AutoMoq
如果有人有推荐,请告诉我,否则我会考虑这个答案。
关于c# - 使用 UnityAutoMoqContainer 注册通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44373972/