简单的测试代码中发生了什么

时间:2016-09-14 15:28:12

标签: c#

我有以下几行代码,并查找了Microsoft文档中的方法和对象定义,但我仍然不明白它是如何工作的。

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

namespace HelloWorld.Tests
{
    [TestClass]
    public class WhenProgramRuns
    {
        private string _consoleOutput;
        [TestInitialize]
        public void Initialize()
        {
            var w = new System.IO.StringWriter();
            Console.SetOut(w);
            Program.Main(new string[0]);
            _consoleOutput = w.GetStringBuilder().ToString().Trim();
        }
        [TestMethod]
        public void SayHelloWorld()
        {
            Assert.AreEqual("Hello, World", _consoleOutput);
        }
    }
}

我不明白" w"将捕获Main的执行结果以及代码作者在调用Main时传递字符串[0]的原因。

这是Main:

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

namespace HelloWorld
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello, World");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

好吧,让我们把它分成几块:

  

我不明白" w"将捕获执行结果   主要

从技术上讲,它不正确表示它会捕获执行结果。我们的wStringWriter的一个实例。 StringWriter实现了TextWriter,用于将信息写入字符串。

控制台将使用此w实例来编写输出数据。

  

以及代码作者在调用Main

时传递字符串[0]的原因

方法main接受string[]作为参数,所以为了调用它,我们必须传递一些东西,因为我们以后真的不需要这个参数,所以传递一个空数组就没问题了。

执行逻辑可以描述为:

  1. 创建StringWriter
  2. 设置控制台以使用此StringWriter输出数据
  3. 使用string[]
  4. 的必需参数运行Main方法的唯一重载
  5. 通过调用GetStringBuilder()上的StringWriter获取构建器,并通过调用ToString()来构建生成的字符串

答案 1 :(得分:0)

Console.SetOut函数将控制台的标准输出重定向到“w”。