проверить вывод в модульном тесте MSTest - PullRequest
7 голосов
/ 19 февраля 2010

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

[TestMethod]
public void OutputTest()
{
    MySnazzyMethod("input", 1, 'c');
    string stdOutFromMySnazzyMethod = /* ??? */;
    Assert.AreEqual("expected output", stdOutFromMySnazzyMethod);
}

Ответы [ 4 ]

3 голосов
/ 19 февраля 2010

Я не уверен, что есть способ получить вывод уже запущенного Process.Что вы могли бы сделать, так это слегка изменить свой код, чтобы не записывать в 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 голосов
/ 19 февраля 2010

Мне понравилась идея ДжаредПара , но я не хотел передавать 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);
0 голосов
/ 01 декабря 2010

Я бы использовал Moles для перенаправления вызова на Console записи в лямбда-метод внутри вашего тестового кода.

string result = ""; 
System.Moles.MConsole.WriteLineString = (s) =>
  { result = s; }; 
Assert.IsTrue(result == "The string I want", 
     "Failed to write to console correctly"); 

См. Стр. 16 в этом документе: Справочное руководство по родинкам .

0 голосов
/ 19 февраля 2010

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

...