2014-03-04 48 views
1
static void Main(string[] args) 
{ 
    for (int i =1 ; i<=100;i++) 
    { 
     Console.WriteLine(i.ToString()); 

     if (i % 3 == 0) 
      Console.WriteLine("HOON"); 
     if (i % 5 == 0) 
      Console.WriteLine("Group"); 
     if (i % 3 == 0 && i % 5 == 0) 
      Console.WriteLine("HOON Group"); 
    } 
} 

我需要使用上面的代碼編寫測試代碼。如何從下面的代碼編寫TDD代碼?

有三個功能。 任何人都可以給我建議嗎?

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
    } 
} 
+0

這是Fizz Buzz的新名字嗎? – GazTheDestroyer

+1

不應該標記爲「家庭作業」或「採訪」? – Albireo

回答

12

無法寫入現有的代碼測試驅動的代碼,因爲測試應該寫你寫的實施之前

最簡單的測試代碼的方法是提供TextWriter模擬到Console.Out並驗證生成的輸出。

更新:如果你想使用TDD,那麼你應該修改你的代碼,使其可測試。這裏你的Program類做了很多事情 - 它負責呈現(輸出結果到控制檯)和業務邏輯(計算值)。爲了測試業務邏輯,您應該將此功能移至獨立的類。

讓我們開始。初試:

[Test] 
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3() 
{ 
    var hoonGroup = new HoonGroup(); 
    string result = hoonGroup.Calculate(3); 
    Assert.AreEqual("HOON", result); 
} 

它編譯失敗,因爲你沒有HoonGroup類。創建類,創建方法Calculate。使代碼可編譯:

public class HoonGroup 
{ 
    public string Calculate(int value) 
    { 
     return ""; 
    } 
} 

現在您的測試失敗,因爲您正在返回空字符串。只需硬編碼「HOON」即可通過測試。這與TDD確定。

public class HoonGroup 
{ 
    public string Calculate(int value) 
    { 
     return "HOON"; 
    } 
} 

下一步測試:

[Test] 
public void ShoulReturnGroupWhenValueDivisibleOnlyBy5() 
{ 
    var hoonGroup = new HoonGroup(); 
    string result = hoonGroup.Calculate(5); 
    Assert.AreEqual("Group", result); 
} 

當然,測試失敗。更新實施:

public class HoonGroup 
{ 
    public string Calculate(int value) 
    { 
     return (value == 5) ? "Group" : "HOON"; 
    } 
} 

看起來很愚蠢。但它實現了您的代碼的所有要求。另一項測試:

[Test] 
public void ShoulReturnNullWhenValueIsNotDivisibleBy3Or5() 
{ 
    var hoonGroup = new HoonGroup(); 
    string result = hoonGroup.Calculate(5); 
    Assert.IsNull(result); 
} 

沒問題 - 添加另一個條件:

public class HoonGroup 
{ 
    public string Calculate(int value) 
    { 
     if (value == 3) 
      return "HOON"; 

     if (value == 5) 
      return "Group"; 

     return null; 
    } 
} 

測試通過。我們需要更多的測試用例。這很容易與NUnit的事 - 只裝修一次測試與TestCase屬性(MSTest also has similar feature):

[TestCase(3)] 
[TestCase(6)] 
[TestCase(99)] 
public void ShoulReturnHoonWhenValueDivisibleOnlyBy3(int value) 
{ 
    var hoonGroup = new HoonGroup(); 
    string result = hoonGroup.Calculate(value); 
    Assert.AreEqual("HOON", result); 
} 

而現在它更容易地創建代碼檢查,如果值是3個,然後列出所有可能的值整除:

public class HoonGroup 
{ 
    public string Calculate(int value) 
    { 
     if (value % 3 == 0) 
      return "HOON"; 

     if (value == 5) 
      return "Group"; 

     return null; 
    } 
} 

我想你會明白TDD的觀點和含義。爲可以被5整除的值創建更多測試用例,併爲可以被3和5整除的值編寫測試。

+1

感謝您的評論,如果我假設我知道我應該在這裏寫什麼,並且我想先寫測試,那麼您可以爲上述邏輯添加一個簡單示例嗎? –

+1

真的很感謝! –

1

重寫代碼以使其可測試。

順便說一句,它看起來錯誤的,所以我會寫這樣的:

static void Main(string[] args) 
{ 
    for (int i =1 ; i<=100;i++) 
    { 
     Console.WriteLine(i.ToString()); 

     var name = GetName(i); 
     if (name != null) 
     { 
      Console.WriteLine(name); 
     } 
    } 
} 

internal static string GetName(int i) 
{ 
    if (i % 3 == 0) 
    { 
     if (i % 5 == 0) 
     { 
      return "HOON Group"; 
     } 
     else 
     {    
      return "HOON"; 
     } 
    } 
    else if (i % 5 == 0) 
    { 
     return "Group"; 
    } 
    else 
    { 
     return null; 
    } 
} 

現在的GetName功能測試。

一個測試可能是這樣的:

[TestMethod] 
public void TestMethod1() 
{ 
    Assert.AreEqual("Hoon Group", Program.GetName(15)); 
    Assert.AreEqual("Hoon", Program.GetName(3)); 
    Assert.AreEqual("Group", Program.GetName(5)); 

    // test other values here 
} 

這個例子假設你有使用InternalsVisibleToAttribute。如果沒有,請使GetName public。欲瞭解更多信息,請參閱http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx