web-dev-qa-db-ja.com

単体テスト内からConsole.Outに送信された出力を取得しますか?

NUnitを使用してC#で単体テストを構築していますが、メインプログラムがコマンドライン引数に応じて実際に正しい出力を出力することをテストしたいと思います。

NUnitテストメソッドからProgram.Main(...)を呼び出して、Console.OutおよびConsole.Errorに書き込まれたすべてのものを取得し、それに対して検証できるようにする方法はありますか?

44

このように、コンソールの入力、出力、エラーをカスタムStringWriterにリダイレクトできます。

[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());
    }
}

詳細については、 このブログ投稿 を参照してください。

71
Mark Seemann

この単純なクラスを使用して、usingステートメントで出力を取得できます。

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();
    }
}

使用方法の例を次に示します。

using (var consoleOutput = new ConsoleOutput())
{
    target.WriteToConsole(text);

    Assert.AreEqual(text, consoleOutput.GetOuput());
}

詳細情報と実用的なコードサンプルは、こちらのブログ投稿にあります- 単体テスト内でコンソール出力を取得する

13
Vasil Trifonov