2017-06-05 135 views
2

我們使用UnityAutoMoq的嘲笑我們大部分的接口在我們的單元測試,但我最近碰到我們想用一個測試框架,以更全面地模擬實際行爲的情況(稱它爲集成測試,如果這有助於你接受我在做什麼)。註冊通用接口與UnityAutoMoqContainer

我期望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

我發現問題在於底層的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,這是遠遠最近更新的,但是它也防止注入工廠從發射相同的攔截限制受到影響。

僅供參考,這裏是我研究了automocking庫:

如果某人有一個建議,那麼請讓我知道,否則我會考慮這個答案。