Grabbing the output sent to Console.Out from within a unit test?

后端 未结 2 580
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-08 02:16

I am building a unit test in C# with NUnit, and I\'d like to test that the main program actually outputs the right output depending on the command line arguments.

Is

相关标签:
2条回答
  • 2020-12-08 02:44

    You can use this simple class to get the output with a using statement:

    public class ConsoleOutput : IDisposable
    {
        private StringWriter stringWriter;
        private TextWriter originalOutput;
    
        public ConsoleOutput()
        {
            stringWriter = new StringWriter();
            originalOutput = Console.Out;
            Console.SetOut(stringWriter);
        }
    
        public string GetOuput()
        {
            return stringWriter.ToString();
        }
    
        public void Dispose()
        {
            Console.SetOut(originalOutput);
            stringWriter.Dispose();
        }
    }
    

    Here is an example how to use it:

    using (var consoleOutput = new ConsoleOutput())
    {
        target.WriteToConsole(text);
    
        Assert.AreEqual(text, consoleOutput.GetOuput());
    }
    

    you can find more detailed information and a working code sample on my blog post here - Getting console output within a unit test.

    0 讨论(0)
  • 2020-12-08 02:46

    You can redirect Console.In, Console.Out and Console.Error to custom StringWriters, like this

    [TestMethod]
    public void ValidateConsoleOutput()
    {
        using (StringWriter sw = new StringWriter())
        {
            Console.SetOut(sw);
    
            ConsoleUser cu = new ConsoleUser();
            cu.DoWork();
    
            string expected = string.Format("Ploeh{0}", Environment.NewLine);
            Assert.AreEqual<string>(expected, sw.ToString());
        }
    }
    

    See this blog post for full details.

    0 讨论(0)
提交回复
热议问题