簡體   English   中英

如何最好地重構由構造函數中創建的其他私有對象組成的代碼

[英]How best to Refactor code that is composed of other private objects that are created in the Constructor

我有以下代碼,這些代碼是在沒有測試的情況下編寫的,但實際上設計得很好,耦合程度很差。 CachedBindingListView構造許多對象,即頁面提供程序和Cache。 如下。

    /// <summary>
    /// Inner data cache
    /// </summary>
    private Cache<T> InnerCache { get; set; }

    /// <summary>
    /// Page provider
    /// </summary>
    private PageProvider<T> PageProvider { get; set; }

    /// <summary>
    /// the Request object that is built with a filter, sort, no of pages etc.
    /// </summary>
    private BindingListRequest<T> BindingListRequest { get; set; }

    #endregion

    #region Constructor

    /// <summary>
    /// New object
    /// </summary>
    /// <param name="bindingListRequest">Request for a particular set of Business Objects</param>
    public CachedBindingListView(BindingListRequest<T> bindingListRequest)
    {
        BindingListRequest = bindingListRequest;
        PageProvider = new PageProvider<T>(BindingListRequest);
        InnerCache = new Cache<T>(PageProvider);
    }

我已經為BindingListRequest,PageProvider和InnerCache編寫了測試。 但現在想開始為CachedBindingList編寫測試。 構造函數當前使用BindingListRequest,並基於此構造頁面提供程序和內部緩存。

出於測試目的,我希望能夠在TestDouble中提供PageProvider和Cache。

這樣做的最佳方法是什么? 我考慮了以下選項。

1)將PageProvider和InnerCache添加到構造函數中,並在需要時注入適當的類型。

2)使用DI框架解析CachedBindingListView構造函數中的PageProvider和Cache。 這將涉及將DI容器注入CachedBindingListView構造函數或使其成為全局容器。

3)創建一個創建PageProvider和Cache甚至可能創建CachedBindingListView的工廠,並使用該工廠在CachedBingingListView的構造函數中創建PageProvider和InnerCache。 這將再次涉及使工廠成為全局工廠,或者將其注入CachedBingingListView的構造方法中。

4)公開PageProvider和InnerCache屬性,並使用DI框架創建CachedBindingListView並通過屬性注入注入PageProvider和InnerCache屬性。 因此,允許我覆蓋測試期間注入的Cache和PageProvider。

我可以看到其中的任何一個如何工作,但它們似乎都顯得有些笨拙和被迫。 那里有什么意見。 對於最好的方法,任何人都有什么建議。

謝謝GD

如果您只想測試它-一種選擇是制作一個注入了所有三個屬性的受保護的構造函數。 然后在您的測試中創建一個從CachedBindingListView繼承的FakeCachedBindingListView,並注入所需的存根,模擬(選擇您的毒葯)。

無論如何,那是我會去的那個。

暫無
暫無

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

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