2009-08-17 79 views
8

我是單元測試的新手。如何檢查控制檯輸出? 我單元測試幫助。如何測試消息輸出到控制檯?

namespace XXShapes 
{ 
    public abstract class XXShape 
    { 
     public virtual void DrawXXShape() 
     { 
      Console.WriteLine("The XXShape was drawn."); 

     } 
    } 

public class XXCircle : XXShape 
{ 
    public override void DrawXXShape() 
    { 
     Console.WriteLine("The XXCircle was drawn."); 
    } 
} 

}

namespace XXShapes.Test 
{ 
    [TestFixture] 
    public class XXShapeTest 
    { 
     [Test] 
     public void MyFirstTest() 
     { 
      XXShape s = new XXCircle(); 
      string expected = "The XXCircle was drawn."; 
      s.DrawXXShape(); 
      string actual = Console.ReadLine(); 
      Assert.AreEqual(expected, actual); 
     } 
    } 


} 

我應該如何正確地進行測試呢? 謝謝你的指點。 乾杯, 〜ck

回答

0

這完全不是你要做的。

在您的測試,你通常會檢查對象的狀態,喜歡的東西:

Assert.IsTrue(foo.Field, Equals, "hello") 

根據您選擇的框架是如何工作的。所以你需要改變你的方法,一般來說,要符合這個模型。

4

你不需要測試'Console.WriteLine'例程,因爲你必須假定它的工作原理 - 它不是你的代碼,所以你爲什麼要測試它。你需要測試你是否會產生傳遞到「Console.WriteLine」

換句話說正確的字符串,而不是:

public override void DrawXXShape() 
{ 
    Console.WriteLine("The XXCircle was drawn."); 
} 

你可以這樣做:

public override void DrawXXShape() 
{ 
    Console.WriteLine(produceXxCircle()); 
} 

public string produceXxCircle() 
{ 
    return "The XXCircle was drawn."; 
} 

,然後在測試案例:

Assert.AreEqual(produceXxCircle(), "The XXCircle was drawn."); 

希望它有幫助。 Regads 西蒙

+0

Assert只是測試produceXxCircle()方法,而不是調用draw方法。 – 2009-08-17 07:15:15

+0

確實,但你想測試什麼?如果Console.WriteLine正確地向控制檯輸出字符串?你不應該測試這個,因爲Console.WriteLine不是你的代碼。它是框架的一部分 – 2009-08-17 07:19:22

+0

是的,原來的代碼正在嘗試執行一個相當空的測試 - 調用's.DrawXXShape();'然後檢查是否調用了'DrawXXShape'方法。但至少它正在開始測試。 – 2009-08-17 08:46:52

14

字面的答案是,你會調用被測類直接stdout到MemoryStream或相似,其內容可在以後檢查之前使用Console.SetOut

更好的答案是使用模擬框架,比如Rhino Mocks創建抽象類的具體實例,並且期望值設置爲DrawXXShape方法將被調用。

0

我假設一些其他測試測試繪圖功能 - 如果您現在要測試您的類特別寫入控制檯的東西,那麼您應該抽象寫入控制檯的想法。

使用其中的WriteLine()方法創建一個接口,並將實現此接口的實例注入到XXShapes中。您的測試可以注入模擬或存根,它們可以捕獲寫入的字符串並在測試中測試其內容。