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

本文关键字:转换 字符串 输出 控制台 | 更新日期: 2023-09-27 17:51:20

我正在制作一个非常简单的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!>.

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

您对如何设置控制台重定向、写入并读取结果有点困惑。为了实现您想要做的事情,请将您的测试方法更改为:

[TestMethod]
public void WriteToConsoleTest()
{
    using (var sw = new StringWriter())
    {
        Console.SetOut(sw);
        ConsoleOutput.Main();
        Assert.AreEqual("Hello World!" + Environment.NewLine, sw.toString());
    }
}

您的测试从不调用ConsoleOutput.Main,因此Hello World!永远不会写入控制台。然后,您在TextWriter上调用ToString,并将其与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());
}