2011-01-19 152 views
3

如何爲此類方法編寫NUnit測試。這種方法本身是否需要重構? 什麼是最好的方法來處理這種情況下的代碼?單元測試舊版C#代碼

  public bool DoXYZ() 
      { 
       ABC abc= new ABC() 
       XYZ xyz = new XYZ(); 
       if (xyz .IsSomeCondition(Session.SessionID)) 
       { return false; } 
       else 
       { return abc.IsSomeOtherCondition(SessionID.SessionID); } 
      } 
+2

這個問題不能沒有顯示多一點的代碼應答。什麼是'Session'?什麼是`SessionID`?包含類是怎樣的? – 2011-01-19 17:52:47

+0

你首先需要知道這個班是做什麼的。知道你可以編寫一個測試來驗證這個方法正在做什麼。順便說一句,我同意其他人,你應該使用一些依賴注入,所以你可以嘲笑那些ABC和XYZ。 – goenning 2011-01-19 18:07:47

回答

3

您可能需要重構它來引入依賴注入的鉤子。例如,包含DoXYZ方法的類可以獲取ABC和XYZ的新屬性。這些屬性可以默認爲ABC和XYZ的實例,但在單元測試中可以用模擬版本替換。

如果你喜歡使用的IoC,這種方法支持以及

1

我肯定會重構通過參數注入會話ID - 否則,你將不得不手動創建會話。

它可以變成靜態的嗎?看起來像,特別是如果你注入sessionid。

此外,您正在實施一個(短)命令調度程序,通常被認爲是反模式,相比IoC(請參閱上面的Joel Martinez的答案)。

1

你有兩個選擇:

  • 重構代碼,並使用依賴注入喬爾和克里斯建議。這可能涉及很多工作,但它會使您的代碼變得乾淨而且易於測試。
  • 使用高級框架模擬非注入依賴關係爲asked in this question

大遺留代碼的方法可能使用兩種方法。

您還可以從MSDN雜誌檢查this article

0

鑑於問題的混淆代碼,我只能提供一些指點

  • 我看2路 - 需要最少做2次單元測試。
  • 在一個方法內創建合作者通常是麻煩的道路。作爲ctor/method參數傳入依賴關係。這允許你派生一個假的和操縱分支(例如,使xyz.IsSomeCondition對於這個測試返回false)。如果ABC和XYZ是簡單的類,很容易設置,那麼它可能不是一個直接的問題..你現在可以沒有提取參數重構。
  • 提取物的sessionId成參數來消除靜電(全局)可變訪問,它通常保持它們先前的值使測試

之間的依賴性。

public bool DoXYZ(ABC abc, XYZ xyz, Guid sessionId) 
{ if (xyz.IsSomeCondition(sessionId))  
     return false; 

    return abc.IsSomeOtherCondition(sessionId); 
}