Я хочу получить вывод, отправленный в стандарт и стандартную погрешность в модульном тесте MSTest так, чтобы я мог проверить его. Я получил вывод прежде при явном выполнении a Process
, но есть ли способ сделать с [я предполагаю] сам процесс MSTest? Например:
[TestMethod]
public void OutputTest()
{
MySnazzyMethod("input", 1, 'c');
string stdOutFromMySnazzyMethod = /* ??? */;
Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
}
Мне понравилась идея JaredPar, но я не хотел передавать Console.Out
и Console.Error
в каждый вспомогательный метод вывода, который у меня есть. Однако мой вывод проходит через один класс, поэтому я просто задал в нем пару статических полей:
internal static TextWriter _stdOut = Console.Out;
internal static TextWriter _stdErr = Console.Error;
Я обновил свои методы вывода в классе обработчика вывода, чтобы они использовали эти поля. Затем я обновил AssemblyInfo.cs этого проекта, включив в него:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyTestProject")]
Таким образом, я могу переопределить _stdOut
и _stdErr
в своих тестовых методах, вызвать тестируемый метод (который использует мой класс обработки вывода) и подтвердить ожидаемый вывод.
OutputHandler._stdOut = new StringWriter();
MySnazzyMethod("input", 1, 'c');
OutputHandler._stdOut.Flush();
string expected = "expected output";
string stdout = OutputHandler._stdOut.ToString().Trim(new[] { '\r', '\n' });
Assert.IsFalse(string.IsNullOrEmpty(stdout));
Assert.AreEqual(expected, stdout);
Просто добавьте пару TraceListener в класс initialize ваших тестовых классов.
Я не уверен, что есть способ получить вывод уже запущенного процесса
. Что вы можете сделать, так это немного реорганизовать свой код, чтобы не писать в Console.WriteLine
, а вместо этого взять экземпляр TextWriter
и записать в него.
В процессе производства вы можете просто передать методу Console.Out
. В тестовом коде вы можете имитировать этот тип и обеспечить более точное тестирование. Например
[TestMethod]
public void OutputTest()
{
var writer = new Mock<TextWriter>(MockBehavior.Strict);
writer.Setup(x => x.WriteLine("expected output")).Verifiable();
MySnazzyMethod(writer.Object, "input", 1, 'c');
writer.Verify();
}
Производственный код
MySnazzyMethod(Console.Out, "input", 1, 'c');