Как получить доступ к консоли из неконсольного приложения?
От: lesovick Россия  
Дата: 05.01.15 14:29
Оценка:
Есть библиотека с функцией записи сообщения на консоль текущего консольного приложения (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: Как получить доступ к консоли из неконсольного приложения?
От: Qulac Россия  
Дата: 05.01.15 14:44
Оценка: 1 (1)
Здравствуйте, 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: Как получить доступ к консоли из неконсольного приложения?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.15 15:46
Оценка: 1 (1) +1
Здравствуйте, lesovick, Вы писали:

L>Можно ли как-то "включить" работу с консолью в неконсольном приложении? Пойдёт и с "невидимым" окном консоли, лишь бы данные туда писались. Спасибо.


http://msdn.microsoft.com/en-us/library/windows/desktop/ms681944(v=vs.85).aspx
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[2]: Как получить доступ к консоли из неконсольного прилож
От: Pavel Dvorkin Россия  
Дата: 05.01.15 16:33
Оценка: 1 (1)
Здравствуйте, AndrewVK, Вы писали:

L>>Можно ли как-то "включить" работу с консолью в неконсольном приложении? Пойдёт и с "невидимым" окном консоли, лишь бы данные туда писались. Спасибо.


AVK>http://msdn.microsoft.com/en-us/library/windows/desktop/ms681944(v=vs.85).aspx


Верно, но придется еще немного повозиться c хендлами-потоками, иначе в новую консоль вывод Console.WriteLine не пойдет.

https://social.msdn.microsoft.com/Forums/en-US/b7a14400-6d72-4fbf-9927-0966f69ef4a2/how-to-open-console-window-in-windows-apllication?forum=csharplanguage

Другой вопрос : почему модульный тест ТС — не консольное приложение ? Тест он или не тест, но если он запускается, значит, какой-то EXE создается скорее всего. А если он создается, то, может быть, можно ему указать, чтобы он в PE-header имел IMAGE_SUBSYSTEM_WINDOWS_CUI, то есть консольный EXE.

Хотя черт ее знает, эту тестовую систему. Может, она DLL создает и ее в каком-то процессе исполняет. Тогда дело глухо.
With best regards
Pavel Dvorkin
Отредактировано 05.01.2015 16:35 Pavel Dvorkin . Предыдущая версия .
Re: Как получить доступ к консоли из неконсольного приложения?
От: TK Лес кывт.рф
Дата: 05.01.15 16:39
Оценка:
Здравствуйте, lesovick, Вы писали:

L>Есть библиотека с функцией записи сообщения на консоль текущего консольного приложения (Console.Write("Test")). Есть необходимость её протестировать.


Реально пишет в консоль или использует STDOUT/STDERR?

L>Тестирование заключается в оценке результата вывода функции на консоль (т.е. оценке строки, полученной из буфера консоли). Есть стандартный инструмент для тестирования: проект модульного теста VS 2012. Есть инструмент для считывания буфера консоли — WinAPI-функция ReadConsoleOutput. При применении в консольном приложении функция работает отлично.


Идея плохая — не надо использовать сторонние артифакты для того не предназначенные.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить доступ к консоли из неконсольного прилож
От: lesovick Россия  
Дата: 05.01.15 17:11
Оценка:
Спасибо за ответы. Вобщем, я решил не выпендриваться и для теста просто перенаправить потоки с помощью Console.SetOut().
Отредактировано 05.01.2015 17:16 lesovick . Предыдущая версия .
Re[4]: Как получить доступ к консоли из неконсольного прилож
От: Pavel Dvorkin Россия  
Дата: 05.01.15 18:44
Оценка:
Здравствуйте, lesovick, Вы писали:

L>Спасибо за ответы. Вобщем, я решил не выпендриваться и для теста просто перенаправить потоки с помощью Console.SetOut().


Гм. А потом читать из файла ?

Если все, что делает это ПО — это Console.WriteLine — должно сработать. Но при работе с консолью есть масса средств, которые могут испортить всю обедню. Например, Console.SetCursorPosition и разные Properties отсюда

http://msdn.microsoft.com/ru-ru/library/system.console%28v=vs.110%29.aspx

Это все в файл не попадет.
With best regards
Pavel Dvorkin
Re[5]: Как получить доступ к консоли из неконсольного прилож
От: TK Лес кывт.рф
Дата: 05.01.15 20:30
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

L>>Спасибо за ответы. Вобщем, я решил не выпендриваться и для теста просто перенаправить потоки с помощью Console.SetOut().

PD>Гм. А потом читать из файла ?

Зачем из файла? Обычно в таких случаях pipe используют.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Как получить доступ к консоли из неконсольного прилож
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.15 03:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Другой вопрос : почему модульный тест ТС — не консольное приложение ?


Потому что это вообще не приложение, а библиотека. Приложением является test runner, их несколько, в том числе и с консолью (mstest.exe). Но речь, видимо, о раннере студийном, у которого обычной консоли по очевидным причинам нет. А вот почему не устраивает вывод в окошко Output вопрос не ко мне.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[6]: Как получить доступ к консоли из неконсольного прилож
От: Pavel Dvorkin Россия  
Дата: 06.01.15 04:59
Оценка:
Здравствуйте, TK, Вы писали:

PD>>Гм. А потом читать из файла ?


TK>Зачем из файла? Обычно в таких случаях pipe используют.


В Pipe то, о чем я писал, тоже не попадет.
With best regards
Pavel Dvorkin
Re[7]: Как получить доступ к консоли из неконсольного прилож
От: TK Лес кывт.рф
Дата: 06.01.15 10:44
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

TK>>Зачем из файла? Обычно в таких случаях pipe используют.

PD>В Pipe то, о чем я писал, тоже не попадет.

Далеко не факт что оно используется. топик стартер говорил только про Console.WriteLine, а городить огород из расчета "а вдруг там есть что-то еще" это не только лишняя но и вредная идея.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[8]: Как получить доступ к консоли из неконсольного прилож
От: Pavel Dvorkin Россия  
Дата: 06.01.15 11:11
Оценка:
Здравствуйте, TK, Вы писали:

TK>Далеко не факт что оно используется. топик стартер говорил только про Console.WriteLine, а городить огород из расчета "а вдруг там есть что-то еще" это не только лишняя но и вредная идея.


Если внимательно прочитаешь мой пост

http://rsdn.ru/forum/dotnet/5913128.1
Автор: Pavel Dvorkin
Дата: 05.01.15


, то я именно и предупреждал его, что, в случае, если что-то там еще есть, могут быть проблемы. Если нет — то и проблем нет. Я же не сказал, что переназначение вывода я отвергаю.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.