2009-08-17 81 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中。您的测试可以注入模拟或存根,它们可以捕获写入的字符串并在测试中测试其内容。