簡體   English   中英

向UnityAutoMoqContainer注冊通用接口

[英]Register Generic Interfaces with UnityAutoMoqContainer

我們使用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會返回一個模擬,而不是完全繞過注入工廠。

有沒有人嘗試過我想要完成的事情? 有任何想法嗎?

我發現問題出在底層的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,但它受到相同的攔截限制,導致注射工廠無法啟動。

供參考,這是我研究的自動模擬庫:

如果有人提出建議,請讓我知道,否則我會認為這是答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM