проверьте вывод в модульный тест MSTest

Я хочу получить вывод, отправленный в стандарт и стандартную погрешность в модульном тесте MSTest так, чтобы я мог проверить его. Я получил вывод прежде при явном выполнении a Process, но есть ли способ сделать с [я предполагаю] сам процесс MSTest? Например:

[TestMethod]
public void OutputTest()
{
    MySnazzyMethod("input", 1, 'c');
    string stdOutFromMySnazzyMethod = /* ??? */;
    Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
}
7
задан Marc Mutz - mmutz 21 April 2011 в 15:14
поделиться

3 ответа

Мне понравилась идея 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);
3
ответ дан 7 December 2019 в 10:01
поделиться

Просто добавьте пару TraceListener в класс initialize ваших тестовых классов.

0
ответ дан 7 December 2019 в 10:01
поделиться

Я не уверен, что есть способ получить вывод уже запущенного процесса . Что вы можете сделать, так это немного реорганизовать свой код, чтобы не писать в 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');
3
ответ дан 7 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: