2012-01-31 43 views
1

我有單元測試具有此方法的類的方法如何使用靜態類,沒有Moles或Isolator的單元測試方法?

 public int GetHighestPriorityPriceRecordIndex(SearchAndExtractReply_2 priceInfoReply) 
    { 
     int index = 0; 

     var priceExposableColumn = GetPriceColumn(priceInfoReply, "LPCIsPriceExposable"); 

     var pricingSourceIDColumn = GetPriceColumn(priceInfoReply, "LPCPricingSourceID"); 

     var priceExposablePriority = new Dictionary<string, int> { { "Y", 2 }, { "N", 1 } }; 

     var pricingSourcePriority = new Dictionary<string, int> { { "USA", 5 }, { "EME", 4 }, { "ASI", 3 }, { "DER", 2 }, { "NUS", 1 } }; 

     if (priceExposableColumn.Value != null) 
      for (int i = 1; i < priceExposableColumn.Value.Length; i++) 
       if (priceExposablePriority[priceExposableColumn.Value[i]] > priceExposablePriority[priceExposableColumn.Value[index]] 
        && pricingSourcePriority[pricingSourceIDColumn.Value[i]] > pricingSourcePriority[pricingSourceIDColumn.Value[index]]) 
        index = i; 

     return index; 
    } 

    private static StringColumn GetPriceColumn(SearchAndExtractReply_2 priceInfoReply, string columnName) 
    { 
     return (StringColumn)SearchAndExtractReply_2_Extension.GetColumn(priceInfoReply, columnName); 
    } 

我想,這種方法使用靜態類和方法 SearchAndExtractReply_2_Extension.GetColumn。 如何更好地重構此代碼,以便我可以在沒有Moles或Isolator的情況下測試此方法?或者更好地使用痣來隔離代碼? 在此先感謝。

回答

2

如果可以,請重構。考慮到你仍然可以選擇使小代碼發生變化,使得Moles聽起來有點矯枉過正。

關於那個重構。引入一個新的課程,唯一的責任是從SearchAndExtractReply_2對象中提取列。這是相當簡單:

public interface IColumnExtractor 
{ 
    StringColumn GetPriceColumn(SearchAndExtractReply_2 source, 
     string columnName); 
} 

public class ColumnExtractor : IColumnExtractor 
{ 
    public StringColumn GetPriceColumn(SearchAndExtractReply_2 source, 
     string columnName) 
    { 
     return (StringColumn)SearchAndExtractReply_2_Extension.GetColumn(source, 
      columnName); 
    } 
} 

現在,無論你原來的方法提供這樣的類實例(添加IColumnExtractor類型的新參數),或(通過構造函數注入例如)提供完全相同的提取到整個類。

public int GetHighestPriorityPriceRecordIndex(
    SearchAndExtractReply_2 priceInfoReply, IColumnExtractor columnExtractor) 
{ 
    // use extractor object instead of static method 
} 

然後你就可以去任何免費的模擬框架(如FakeItEasyMoq)。

2

如果你依賴於某些東西,它應該傳遞給方法。那麼你的API是清楚的,你可以從外面告訴需要什麼和可以嘲笑什麼。這意味着您將建築邏輯和業務邏輯分開。當與像Unity或Castle這樣的依賴注入框架結合使用時,它會爲您提供單元測試中很好的可測試代碼,以及易於在生產環境中使用的代碼。

我會爲您的SearchAndExtractReply_2_Extension創建一個接口,然後將其作爲參數傳遞給GetHighestPriorityPriceRecordIndex(或者,如果它在多個位置使用,則可能傳遞給構造函數)。然後,您可以模擬整個依賴關係,或者在進行集成測試時將「實際實現」傳遞給它。

+0

由於我udnderstood我需要你的依賴注入正確嗎? – Serghei 2012-01-31 16:16:29

+0

是的,這將有助於使代碼更加清晰,並且會爲您提供接縫,您可以插入模擬以確保可以獨立測試代碼。 – 2012-01-31 16:22:17

+0

問題是我在一個大的遺留解決方案中工作,並且包含IoC容器需要重構大量代碼和噸代碼。 – Serghei 2012-01-31 16:29:41

相關問題