[英]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.