unit testing帮助。 如何测试输出到控制台的消息?

我是unit testing的新手。 如何检查控制台输出? 我有

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

字面上的答案是你在调用被测试的类之前使用Console.SetOutstdout引导到memoryStream或类似的东西,你可以在以后检查它们的内容。

更好的答案是使用一个模拟框架,比如Rhino Mocks来创建抽象类的具体实例,并期望设置为调用DrawXXShape方法。

您不需要测试’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."); 

希望能帮助到你。 告诉西蒙

那根本不是你要做的。

在测试中,您通常会检查对象的状态,例如:

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

取决于您选择的框架的工作方式。 因此,您通常需要更改方法以符合此模型。

我假设其他一些测试测试绘图function – 如果你现在想要测试你的类特别是在控制台上写一些东西,那么你应该抽象写入控制台的想法。

在其中创建一个带有WriteLine()方法的接口,并将实现此接口的实例注入XXShapes。 您的测试可以注入模拟或存根,可以捕获写入的字符串并在测试中测试其内容。