如何将控制台输出转换为字符串?

时间:2015-06-01 15:38:25

标签: c#

我正在制作一个非常简单的C#程序,它输出文本并尝试测试它。我的测试一直失败,因为来自控制台的文本与我正在比较它的文本不相等。我认为它没有正确转换为字符串,但我不知道。 这是程序代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab3._1
{
    public class ConsoleOutput
    {
        static void Main()
        {
            Console.WriteLine("Hello World!");
        }
    }
}

这是测试代码:

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Lab3._1Test
{
    [TestClass]
    public class ConsoleOutputTest
    {
        [TestMethod]
        public void WriteToConsoleTest()
        {
            var currentConsoleOut = Console.Out;
            string newConsoleOut = currentConsoleOut.ToString();

            string ConsoleOutput = "Hello World!";

            Assert.AreEqual(newConsoleOut, ConsoleOutput);
        }
    }
}

这是我得到的错误:

Test Failed - WriteToConsoleTest
Message: Assert.AreEqual failed.
Expected:<System.IO.TextWriter+SyncTextWriter>.Actual:<Hello World!>.

2 个答案:

答案 0 :(得分:2)

你对如何设置控制台重定向,写入然后读取结果有点困惑。要实现您要执行的操作,请将测试方法更改为:

[TestMethod]
public void WriteToConsoleTest()
{
    using (var sw = new StringWriter())
    {
        Console.SetOut(sw);
        ConsoleOutput.Main();

        Assert.AreEqual("Hello World!" + Environment.NewLine, sw.toString());
    }
}

答案 1 :(得分:1)

您的测试从不调用ConsoleOutput.Main,因此永远不会将Hello World!写入控制台。然后,您在ToString上调用TextWriter并将其与string进行比较,因此您需要比较苹果和橙子。

如果要捕获写入控制台的内容,则应将其重定向到备用TextWriter实现:

[TestMethod]
public void WriteToConsoleTest()
{
    // setup test - redirect Console.Out
    var sw = new StringWriter();    
    Console.SetOut(sw);

    // exercise system under test
    ConsoleOutput.Main();

    // verify
    Assert.AreEqual("Hello World!\r\n", sw.ToString());
}