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

时间:2009-08-17 07:03:30

标签: c# tdd nunit

我是单位测试的新手。如何检查控制台输出? 我有

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

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分: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 西蒙

答案 2 :(得分:0)

这根本不是你要做的。

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

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

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

答案 3 :(得分:0)

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

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