コンソールアプリの中で標準出力している文言をMSTestでテストしたい
- テスト対象の戻り値が成功でも状態によって出力される文言が変わるのでテストしておきたい
- StringWriter でコンソール出力を奪ってからメソッドを実行し、StringReaderで読み出せば良いらしい
[TestClass]
public class HogehogeTest
{
[TestMethod]
public void fooという処理でbarという文字列が出てくる()
{
string expected = "bar";
var builder = new StringBuilder();
var writer = new StringWriter(builder);
Console.SetOut(writer);
Foo();
var reader = new StringReader(builder.ToString());
string consoleMessage = reader.ReadToEnd();
StringAssert.Contains(consoleMessage, expected);
}
}
- StringWriter/StringReader使うときにusingで囲んだ方がいいし、後始末でコンソールを戻すとかあるけど、ざっくりこんな感じ。
- ここを参考にしました。
How to redirect the standard console output, to assert logmessages written by log4net. – Knowledgebase
追記
consoleMessage
に改行が含まれているとうまく評価できないようなので以下のようにしました。
StringAssert.Contains(consoleMessage, expected);
↓
StringAssert.Contains(consoleMessage.Replace(Environment.NewLine, ""), expected);
[TestClass]
public class HogehogeTest
{
[TestMethod]
public void fooという処理でbarという文字列が出てくる()
{
string expected = "bar";
var builder = new StringBuilder();
var writer = new StringWriter(builder);
Console.SetOut(writer);
Foo();
var reader = new StringReader(builder.ToString());
string consoleMessage = reader.ReadToEnd();
StringAssert.Contains(consoleMessage.Replace(Environment.NewLine, ""), expected);
}
}