Есть библиотека с функцией записи сообщения на консоль текущего консольного приложения (Console.Write("Test")). Есть необходимость её протестировать. Тестирование заключается в оценке результата вывода функции на консоль (т.е. оценке строки, полученной из буфера консоли). Есть стандартный инструмент для тестирования: проект модульного теста VS 2012. Есть инструмент для считывания буфера консоли — WinAPI-функция ReadConsoleOutput. При применении в консольном приложении функция работает отлично.
PD>http://msdn.microsoft.com/en-us/library/windows/desktop/ms684965(v=vs.85).aspx PD>http://stackoverflow.com/questions/12355378/read-from-location-on-console-c-sharp
Беда в том, что модульный тест — это не консольное приложение. Если попытаться вызвать функцию Console.Write("Test") в НЕконсольном приложении, она будет выполнена без к.-л. Exceptions. Но в консольный буфер, судя по всему, ничего не попадёт. По крайней мере вызов ReadConsoleOutput демонстрирует пустые строки.
Можно ли как-то "включить" работу с консолью в неконсольном приложении? Пойдёт и с "невидимым" окном консоли, лишь бы данные туда писались. Спасибо.
Re: Как получить доступ к консоли из неконсольного приложения?
Здравствуйте, lesovick, Вы писали:
L>Есть библиотека с функцией записи сообщения на консоль текущего консольного приложения (Console.Write("Test")). Есть необходимость её протестировать. Тестирование заключается в оценке результата вывода функции на консоль (т.е. оценке строки, полученной из буфера консоли). Есть стандартный инструмент для тестирования: проект модульного теста VS 2012. Есть инструмент для считывания буфера консоли — WinAPI-функция ReadConsoleOutput. При применении в консольном приложении функция работает отлично.
PD>>http://msdn.microsoft.com/en-us/library/windows/desktop/ms684965(v=vs.85).aspx PD>>http://stackoverflow.com/questions/12355378/read-from-location-on-console-c-sharp
L>Беда в том, что модульный тест — это не консольное приложение. Если попытаться вызвать функцию Console.Write("Test") в НЕконсольном приложении, она будет выполнена без к.-л. Exceptions. Но в консольный буфер, судя по всему, ничего не попадёт. По крайней мере вызов ReadConsoleOutput демонстрирует пустые строки.
L>Можно ли как-то "включить" работу с консолью в неконсольном приложении? Пойдёт и с "невидимым" окном консоли, лишь бы данные туда писались. Спасибо.
Используйте Microsoft Fakes в тестах. Нужно создать оболочку над Console, а в ней проверять, что попадает в метод Write.
Программа – это мысли спрессованные в код
Re: Как получить доступ к консоли из неконсольного приложения?
Здравствуйте, lesovick, Вы писали:
L>Можно ли как-то "включить" работу с консолью в неконсольном приложении? Пойдёт и с "невидимым" окном консоли, лишь бы данные туда писались. Спасибо.
Другой вопрос : почему модульный тест ТС — не консольное приложение ? Тест он или не тест, но если он запускается, значит, какой-то EXE создается скорее всего. А если он создается, то, может быть, можно ему указать, чтобы он в PE-header имел IMAGE_SUBSYSTEM_WINDOWS_CUI, то есть консольный EXE.
Хотя черт ее знает, эту тестовую систему. Может, она DLL создает и ее в каком-то процессе исполняет. Тогда дело глухо.
Здравствуйте, lesovick, Вы писали:
L>Есть библиотека с функцией записи сообщения на консоль текущего консольного приложения (Console.Write("Test")). Есть необходимость её протестировать.
Реально пишет в консоль или использует STDOUT/STDERR?
L>Тестирование заключается в оценке результата вывода функции на консоль (т.е. оценке строки, полученной из буфера консоли). Есть стандартный инструмент для тестирования: проект модульного теста VS 2012. Есть инструмент для считывания буфера консоли — WinAPI-функция ReadConsoleOutput. При применении в консольном приложении функция работает отлично.
Идея плохая — не надо использовать сторонние артифакты для того не предназначенные.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить доступ к консоли из неконсольного прилож
Здравствуйте, lesovick, Вы писали:
L>Спасибо за ответы. Вобщем, я решил не выпендриваться и для теста просто перенаправить потоки с помощью Console.SetOut().
Гм. А потом читать из файла ?
Если все, что делает это ПО — это Console.WriteLine — должно сработать. Но при работе с консолью есть масса средств, которые могут испортить всю обедню. Например, Console.SetCursorPosition и разные Properties отсюда
Здравствуйте, Pavel Dvorkin, Вы писали:
L>>Спасибо за ответы. Вобщем, я решил не выпендриваться и для теста просто перенаправить потоки с помощью Console.SetOut(). PD>Гм. А потом читать из файла ?
Зачем из файла? Обычно в таких случаях pipe используют.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить доступ к консоли из неконсольного прилож
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Другой вопрос : почему модульный тест ТС — не консольное приложение ?
Потому что это вообще не приложение, а библиотека. Приложением является test runner, их несколько, в том числе и с консолью (mstest.exe). Но речь, видимо, о раннере студийном, у которого обычной консоли по очевидным причинам нет. А вот почему не устраивает вывод в окошко Output вопрос не ко мне.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, Pavel Dvorkin, Вы писали:
TK>>Зачем из файла? Обычно в таких случаях pipe используют. PD>В Pipe то, о чем я писал, тоже не попадет.
Далеко не факт что оно используется. топик стартер говорил только про Console.WriteLine, а городить огород из расчета "а вдруг там есть что-то еще" это не только лишняя но и вредная идея.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[8]: Как получить доступ к консоли из неконсольного прилож
Здравствуйте, TK, Вы писали:
TK>Далеко не факт что оно используется. топик стартер говорил только про Console.WriteLine, а городить огород из расчета "а вдруг там есть что-то еще" это не только лишняя но и вредная идея.
, то я именно и предупреждал его, что, в случае, если что-то там еще есть, могут быть проблемы. Если нет — то и проблем нет. Я же не сказал, что переназначение вывода я отвергаю.