我们使用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返回一个模拟,完全绕过注入工厂。
有没有人尝试过我想要完成的任何事情?有什么想法吗?
答案 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,它最近更新了,但它受到相同的拦截限制,阻止了注射工厂的射击。
供参考,以下是我研究过的自动插件库:
如果有人有推荐,请告诉我,否则我会认为这是答案。