2014-02-28 29 views
0

所以我知道TDD你應該先寫測試,但是我無法理解如何爲下面的代碼編寫測試。有人可以在出發點幫助我嗎?我會如何編寫這樣的單元測試?

private string GetWMIProperty(string property) 
{ 
    string value = string.Empty; 
    SelectQuery selectQuery = new SelectQuery("Win32_OperatingSystem"); 
    using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery)) 
    { 

     foreach (ManagementObject mo in searcher.Get()) 
     { 
      value = mo[property].ToString(); 
     } 
    } 
    return value; 
} 

回答

5

你只寫的方法的各種結果的測試,並在這樣做你會定義方法的預期行爲,而不實際編寫方法尚未:

[TestMethod] 
public MyClass_GetWMIProperty_GivenGoodInput_ReturnsString() 
{ 
    var myClass = new MyClass(); 
    var result = myClass.GetWMIProperty("goodinput"); 
    Assert.IsNotNull(result); 
} 

[TestMethod] 
public MyClass_GetWMIProperty_GivenNullInput_ThrowsArgumentNullException() 
{ 
    var myClass = new MyClass(); 

    try 
    { 
     var result = myClass.GetWMIProperty(null); 
    } 
    catch (ArgumentNullException) 
    { 
     // Good 
     return; 
    } 

    // Exception not thrown 
    Assert.Fail(); 
} 

[TestMethod] 
public MyClass_GetWMIProperty_GivenBadInput_ReturnsNull() 
{ 
    var myClass = new MyClass(); 
    var result = myClass.GetWMIProperty("badinput"); 
    Assert.IsNull(result); 
} 

你的方法將存根如下:

// Note public/internal so tests can see it 
public string GetWMIProperty(string property) 
{ 
    // Stubbed 
    throw new NotImplementedException(); 
} 

這三個測試方法將在這種狀態下失敗,因爲NotImplementedException會被拋出,而不是由任何人抓獲。

接下來,您會寫出方法的實際內容,以便您可以在這些測試中調用它,並且它們都會通過。 TDD的核心思想是測試定義行爲。在這裏,我們定義:

  • 良好的輸入返回一個字符串
  • 壞輸入返回null
  • 空輸入拋出ArgumentNullException。
+2

一些樣式註釋:有一個測試類,用於在一個特定類中使用方法作爲起點的測試。這意味着你調用這個文件'MyClassTests'並從你的方法名稱中刪除'MyClass'。此外:我認爲這可能只是因爲它是抽象的,但'壞的輸入'不是描述性的,應該是'_UnknownProperty_'和'_UnsupportedProperty_'(例如)。 –

+0

@JeroenVannevel我曾經這樣做過MyClassTests方法(省略了測試方法名稱中的類名稱),但是我發現IDE中的測試列表在沒有類名稱前綴的情況下是模糊的;用上述前綴我可以按類對列表進行排序。 :) – Haney

相關問題