如何使用xUnit.net进行单元测试控制台输出?

时间:2012-06-13 16:47:08

标签: c# unit-testing console xunit.net

我有一个打印类的私有变量的方法。

public class Test
{
    private int number;

    public Test(int number)
    {
        this.number = number;
    }

    public void PrintValue()
    {
        Console.WriteLine("Number: " + number);
    }
}

如何创建单元测试以确保它在控制台上打印我期望的值?

2 个答案:

答案 0 :(得分:10)

使控制台输出成为依赖项。由于Console.WriteLine会将其输出重定向到Console.Out property,因此您需要的只是TextWriter个实例:

public Test(TextWriter outputWriter, int number)
{
    this.outputWriter = outputWriter;
    this.number = number;
}

public void PrintValue()
{
    outputWriter.WriteLine("Number: " + number);
}

在实际应用程序中,您将其传递给Console.Out以打印到系统控制台。在测试中,您只需使用假作者(例如StringWriter基于StringBuilder):

const int NumberToPrint = 5;
var content = new StringBuilder();
var writer = new StringWriter(content);
var sut = new Test(writer, NumberToPrint);

sut.PrintNumber();

var actualOutput = content.ToString();
Assert.AreEqual(actualOutput, "Number: 5");

答案 1 :(得分:0)

您可以使用 Console.SetOut 重定向控制台输出并执行您想做的事情!

 var output = new StringWriter();
 Console.SetOut(output);

 do_something_that_writes_to_console();
 var outputString = output.ToString();
 //check for whatever you need here.