2011-04-12 34 views
0

當引用我們使用委託其​​他類。在單元測試期間,我們重寫這些值。C#中的數組引用

我有一個類,它比其他20類的引用,所以我想我會創建代表組成的數組。如果我創建這些代表的靜態陣列(見下面的代碼)它存儲的代表值,而不是參考委託。

作爲結果,單元測試不能更新該值。爲了解決這個問題,我創建了一個委託數組,當我想使用它們時,我想讓下面的代碼工作。

private static Func<int, bool> firstMethod = ExternalClass1.Method; 
private static Func<int, bool> secondMethod = ExternalClass2.Method; 
private static Func<int, bool> thirdMethod = ExternalClass3.Method; 

private static Func<int, bool>[] handlers = { first, second, third }; 

public bool Test(int value) 
{ 
    foreach (var handler in handlers) 
    { 
     if (handler.Invoke(value) == true) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
+3

那麼問題是什麼?什麼是錯誤? – 2011-04-12 18:32:48

+0

您是否考慮過在某些情況下使用接口而不是委託? – TrueWill 2011-04-12 18:43:31

+0

我們使用CSLA,因此所討論的方法是靜態的。 AIUI接口不能用靜態方法實現,所以這種方法不是一種選擇。 – sixeyes 2011-04-12 19:06:40

回答

2

而不是創建該處理器陣列,你可以做這樣的事情:

private static IEnumerable<Func<int,bool>> GetHandlers() 
{ 
    yield return firstMethod; 
    yield return secondMethod; 
    yield return thirdMethod; 
} 

現在你有辦法讓現場實際引用,以便它們可以被替換爲單元測試,也有一種方法可以遍歷所有的處理程序。也就是說,可以替換的代理數組基本上是可以被覆蓋的一個接口或一組抽象方法。如果你使用設計來提供它的語言特性來實現多態性,它可能會更清潔和更易於維護。爲了在單元測試換出使用委託行爲的方便,你可以像使用最小起訂量嘲弄框架,以嘲弄的接口,而無需編寫特定的測試類。

-Dan

+0

謝謝。這看起來就像我之後的事情。 – sixeyes 2011-04-12 19:02:17