2011-11-28 51 views
1

我已經看了很多例子,但在這種情況下,我希望得到一個新的眼睛重構下面的這個方法,以便我可以單元測試它。我使用mstest與moq和我知道appsettings是一個問題,隨着HttpContext被密封.... 任何幫助或想法(建設性)非常感激。尋找重構Appsettings和HttpContext的單元測試和moq

public void DoClaimSearch(SearchClaimInfo clmRequest) 
    { 
     var result = claimManager.ClaimSearch(clmRequest); 
     if (result.RespMsg.TotalRowCount > Convert.ToInt32(ConfigurationManager.AppSettings.Get("TotalRowCount_Max_ClaimSearch"))) 
     { 
      string ResKey = HttpContext.GetGlobalResourceObject("Global", "info_toomanyrecordsmatch.Text").ToString(); 
      ResKey = ResKey.Replace("{0}", result.RespMsg.TotalRowCount.ToString()); 
      View.AddNotification(WidgetNotificationType.Error,ResKey); 
     } 
     else 
     { 
      View.SetWidgetResponseData(result.RespMsg.SearchResults); 
     } 
    } 

回答

1

,你可以:

解決方案一:

通過參數的方法傳遞兩個配置值。這是一個好主意,取決於調用方法的位置。這可能不是一個好主意設計,但它會很容易測試(只需在測試中發送這些參數的硬編碼值)。

解決方法二:

創建一個類來封裝這些資源的調用。某種配置代理。這個類將有一個接口並被注入到構造函數中。這樣可以很容易地進行模擬和測試。它將添加一個抽象來訪問您的資源。配置代理客戶端不會在乎資源是否位於Resx,.config,HttContext或其他任何地方。

解決方案三:

有類的構造函數檢索這些值,並將它們分配到可以在你的函數中使用私有成員變量。與解決方案1類似,這將阻止調用代碼瞭解這些配置值。爲了方便測試,可以使用第二個非默認構造函數來接收參數中的配置值。這樣,如果你只是使用默認的構造函數,ctor就會調用ConfigurationManager等。但是在你的測試中,你可以調用第二個構造函數並傳入這些值(這甚至需要模擬這些值)。

+0

感謝您使用3種解決方案進行響應。 –