2012-09-15 79 views
3

這是一個非常基本的問題,但我仍然無法找到合適的答案。在我的測試中,可能有空值,因爲最後一個階段(Act)開始看起來有點奇怪(它不再只是行爲)。我的意思是這樣的:單元測試檢查爲空

Assert.IsNotNull(variable); 

var newVariable = variable.Property; 
Assert.IsNotNull(newVariable); 

var finalVariable = newVariable.AnotherProperty; 
Assert.AreEqual(3, finalVariable.Count); 

現在,他們有明顯的關係,我必須確保該值不爲空,但也有三個主張在一個測試和行爲的部分開始看不正確。

那麼這種情況下的一般解決方案是什麼?有沒有什麼比3個測試更聰明,每個測試都有一個斷言,並在最後2個斷言之前檢查爲空?

回答

1

基本上有處理你的問題的方法有兩種:

  1. Guard assertions:額外的斷言確保數據在已知狀態適當的測試發生之前(也就是你在做什麼現在)。
  2. 移動後衛斷言自己測試。

選擇哪個選項在很大程度上取決於測試中的代碼。如果前提條件在其他測試中會被重複,則這是暗示單獨的測試方法。如果先決條件在生產代碼中有所反映,則再次提示單獨的測試方法。另一方面,如果它只是提高信心的一種方式,也許單獨的測試過多(但在其他答案中已經提到過,這可能表示您未完全控制測試或者你一次測試太多東西)。

0

我認爲你應該把這個測試分成三個測試,並根據發生的情況命名。即使您在這些測試中的行爲相同,您也可以通過檢查方法的返回值來測試不同的場景。

0

空是皇室的痛苦。問題是,他們能合理地存在嗎?

讓我們將討論分解爲代碼和測試。

如果null不應該存在,那麼代碼本身而不是測試應檢查並驗證它們不爲空。出於這個原因,我的代碼每一個方法是使用檢查參數的片斷建:

public VideoPosition(FrameRate theFrameRate, TimeSpan theAirTime) 
    { 

     Logger.LogMethod("theVideoMovie", theFrameRate, "theAirTime", theAirTime); 
     try 
     { 
      #region VerifyInputs 

      Validator.Verify(theFrameRate); 
      Validator.Verify(theAirTime); 
      Validator.VerifyTrue(theAirTime.Ticks >= 0, "theAirTime.Ticks >= 0"); 

如果空在代碼中合法的,但你正在測試一種情況,返回的值不能爲空,那麼當然你必須在你的測試代碼中驗證這一點。

0

在你的單元測試中,你應該能夠控制你的課堂上的每一個輸入。這意味着你可以控制變量是否有值。

所以,你將有一個單元測試,強制你的變量爲空,然後斷言這一點。

然後,您將進行另一個測試,您可以確定您的變量有一個值,並且您不需要其他斷言。

我前一段時間寫了一篇關於這個的博客。也許它可以幫助:Unit Testing, hell or heaven?