将原始C#程序输出重定向到Xunit输出

时间:2020-07-03 09:53:46

标签: c# xunit

是否可以将原始程序输出重定向到XUnit输出?

我所能找到的就是如何打印XUnit测试的输出(请参见here

“原始输出”是指我每次在程序中编写Console.WriteLine或类似内容时,都希望在查看测试结果时该输出存在。

我知道可以将控制台输出重定向到其他文本编写器(source),如何设置测试以将所有输出重定向到Xunit?

1 个答案:

答案 0 :(得分:0)

这是一个小工作,但可以实现。

就像您提到的那样,您遇到了ITestOutputHelper。稍加努力,您就可以将Console的输出重定向到实现TextWriter的新类。

因此,如果您将以下内容放在一起:

public class RedirectOutput : TextWriter
{
    private readonly ITestOutputHelper _output;

    public RedirectOutput(ITestOutputHelper output)
    {
        _output = output;
    }

    public override Encoding Encoding { get; } // set some if required

    public override void WriteLine(string? value)
    {
        _output.WriteLine(value);
    }
}

然后在您的测试构造函数中(我怀疑您缺少该块吗?):

public class UnitTest1
{
    public UnitTest1(ITestOutputHelper output)
    {
        Console.SetOut(new RedirectOutput(output));
    }

    ...
}

这是我们从ConsoleITestOutputHelper 的重定向。

这样做的缺点是您将需要覆盖对Console的每次使用。在代码中写入的调用。因此RedirectOutput可能会变得很大。有关列表重载,请参见ms docs here

我不知道其他任何方式-我希望它会更简单。当然在某处还有另一种解决方案。

但是,如果您还没有的话,至少这会让您前进。

对于在代码中使用控制台写入的设计,也可能值得重新思考。也许与自定义界面输出有关?

相关问题