Как писать в консоль.Выход во время выполнения теста MSTest
контекст:
У нас есть некоторые пользователи сообщают проблемы с функцией загрузки файлов в веб-приложение. Это происходит только изредка и без какой-либо особой картины. Мы пытались выяснить это в течение длительного времени, добавляя отладочную информацию в любом месте, где мы можем подумать, что это может помочь, просматривая журналы и т. д., Но мы не смогли воспроизвести или понять это.
:
Я сейчас пытаюсь воспроизведите это с помощью MSTest и WatiN, чтобы повторить операцию, которая должна завершиться с ошибкой большое количество раз (несколько сотен). Просто понятия о том, как далеко в цикле тест получил, я хочу напечатать что-то вроде:
Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));
однако это не отображается в окне вывода. Теперь я знаю, что вы получите вывод консоли в результатах теста (а также то, что вы выводите из Debug.Writeline
etc), но это не доступно до после испытание законченный. И поскольку мой тест с сотнями повторений может занять довольно много времени, я хотел бы знать, как далеко он продвинулся.
вопрос:
Есть ли способ, которым я могу получить вывод консоли в окне вывода во время выполнение теста?
5 ответов:
вывод консоли не отображается, потому что внутренний код не выполняется в контексте теста.
вы, вероятно, лучше использовать
Trace.WriteLine
(В Системе.Диагностика), а затем добавление прослушивателя трассировки, который записывает в файл.эта тема из MSDN показывает способ сделать это.
Я нашел свое собственное решение. Я знаю, что ответ Andras, вероятно, наиболее соответствует MSTEST, но мне не хотелось рефакторинговать свой код.
[TestMethod] public void OneIsOne() { using (ConsoleRedirector cr = new ConsoleRedirector()) { Assert.IsFalse(cr.ToString().Contains("New text")); /* call some method that writes "New text" to stdout */ Assert.IsTrue(cr.ToString().Contains("New text")); } }
одноразовые
ConsoleRedirector
определено как:internal class ConsoleRedirector : IDisposable { private StringWriter _consoleOutput = new StringWriter(); private TextWriter _originalConsoleOutput; public ConsoleRedirector() { this._originalConsoleOutput = Console.Out; Console.SetOut(_consoleOutput); } public void Dispose() { Console.SetOut(_originalConsoleOutput); Console.Write(this.ToString()); this._consoleOutput.Dispose(); } public override string ToString() { return this._consoleOutput.ToString(); } }