【问题标题】:Unit Test Help. How do I test for a message output to console?单元测试帮助。如何测试消息输出到控制台?
【发布时间】:2009-08-17 07:03:29
【问题描述】:

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

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

【问题讨论】:

    标签: c# tdd nunit


    【解决方案1】:

    字面上的答案是,您将在调用被测类之前使用 Console.SetOutstdout 引导到 memoryStream 或类似的,稍后您可以检查其内容。

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

    【讨论】:

      【解决方案2】:

      您不需要测试“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 西蒙

      【讨论】:

      • 那个 Assert 只是在测试 producerXxCircle() 方法,而不是调用 draw 方法。
      • 确实如此,但是您要测试什么?如果 Console.WriteLine 正确地将字符串输出到控制台?您不应该对此进行测试,因为 Console.WriteLine 不是您的代码。它是框架的一部分
      • 是的,给定的原始代码试图执行一个相当空的测试——调用s.DrawXXShape();,然后检查DrawXXShape方法是否已被调用。但至少它正在开始测试。
      【解决方案3】:

      这根本不是你会做的。

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

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

      取决于您选择的框架的工作方式。所以你需要改变你的方法,一般来说,以符合这个模型。

      【讨论】:

        【解决方案4】:

        我假设其他一些测试测试绘图功能 - 如果您现在想要测试您的类是否特别向控制台写入了某些内容,那么您应该抽象出写入控制台的想法。

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

        【讨论】:

          猜你喜欢
          • 2013-09-10
          • 1970-01-01
          • 2015-08-12
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          • 2019-04-02
          • 1970-01-01
          • 2014-01-02
          相关资源
          最近更新 更多