2014-10-20 23 views
1

我想了解TDD,但我見過的所有例子都顯示了add(),substract()等方法,我知道如何通過unittest測試。但是如何測試一個沒有參數的方法?如何爲沒有參數的方法編寫testmethods?

例如,您會如何爲此方法編寫測試方法?

public List<string> testmethod() 
    { 
     List<string> ret = new List<string>(); 
     using (SqlConnection conn = new SqlConnection(constring)) 
     using (SqlCommand cmd = conn.CreateCommand()) 
     { 
      SqlDataReader reader; 
      cmd.CommandText = "select * from users"; 

      conn.Open(); 
      reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       ret.Add(reader["name"].ToString()); 
      } 
      conn.Close(); 
     } 
     return ret; 
    } 

我的意思是,你有什麼要測試?

+1

測試它是否返回帶有字符串的列表? – AssaultingCuccos 2014-10-20 12:12:11

+3

通常情況下,您會注入一個IDbConnection,然後對其進行模擬以確保此方法與其正確交互。或者你將有代碼來設置數據庫並測試它是否返回了正確的數據,但這是集成測試,而不是單元測試。 – juharr 2014-10-20 12:15:01

+0

至於任何方法(不管事實上它接受參數還是返回),這個想法是確保該方法完成它應該做的事情。在你的情況下,確保它從db讀取用戶名。 – 2014-10-20 12:15:39

回答

3

技術上你不會單元測試那個方法。由於代碼被耦合到數據庫,所以它將是一個集成測試。 (如果你想測試與數據訪問分開的邏輯,那麼你會把它分成兩部分,一部分是邏輯部分,另一部分是數據訪問部分。)

除了那個小挑剔之外,模式是一樣的。任何重複的自動化測試應該有三個步驟:

  1. 安排
  2. 斷言

假設 「法案」 的步驟很簡單:

var result = testmethod(); 

什麼,那麼,將是「斷言」步驟?你怎麼知道這個方法做了它應該做的事情?它返回一個結果,所以我想你會檢查這個結果,看看它是什麼,你期望它得到某些已知的條件。

這些條件是什麼?這是「安排」步驟。這個想法是,你建立了一個你所期望的已知結果的已知場景。然後你執行代碼。然後你檢查結果是否符合你的期望。

例如,而不是Add(1, 1),你已經知道如何測試的例子,考慮這個對象:(這是一個愚蠢的對象我知道,但我承擔)

public class Adder 
{ 
    public int Augend { get; set; } 
    public int Addend { get; set; } 

    public int Add() 
    { 
     return Augend + Addend; 
    } 
} 

你如何測試自己的方法?首先設置環境:

// Arrange 
var adder = new Adder(); 
adder.Augend = 1; 
adder.Addend = 1; 

// Act 
var result = adder.Add(); 

// Assert 
Assert.AreEqual(2, result); 

在您的情況下「安排」的步驟可能會很投入,因爲有一個數據庫的直接訪問。但是這個概念是一樣的。測試首先創建一個已知的系統狀態,然後執行一個操作,然後檢查系統的新狀態。(如果創建狀態和檢查狀態以及之後留下的副作用有點麻煩,那麼這很好地表明代碼中存在太多耦合,並且您想要將事情分開有點。)

3

你的方法實際上做多件事情,它們是:

  1. 執行查詢
  2. 轉換的查詢結果字符串列表。

不幸的是,其中一件事情不是真的適合單元測試(執行查詢),但另一件事是。所以理想情況下,你應該分解你的方法,然後你可以測試轉換邏輯。

相關問題