Можно ли разместить консоль Windows в модуле безголового тестирования, например, в resharper? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть библиотека программного обеспечения, предназначенная для консольных приложений.Я хотел бы запустить небольшой набор интеграционных тестов, использующих консоль Windows, в безголовом средстве запуска, которое в идеале должно запускаться на нашем сервере сборки и в модуле тестирования нового образца.

Чтобы это работало, мне нужно, чтобы в тесте выполнялись реальные вызовы System.Console (чтобы они не могли быть закомментированы условно).

Когда тесты вызывают то, чтотребует дескриптор stdout, например, Console.SetCursorPosition, генерируется исключение: System.IO.IOException: 'The handle is invalid'

Я предположил, что мог бы просто сделать пинвоук и вызвать FreeConsole и AllocConsole, и это позволило бы мне вызвать соответствующийметоды.К сожалению, это не так.

В настоящее время я могу успешно освободить, распределить и перенаправить вывод консоли обратно в STDOUT, но это не меняет поведение исключения.Есть идеи?

Я перенаправляю STDOUT обратно в CONOUT, используя следующее: -

var stdoutFile = ExternalMethods.CreateFile("CONOUT$", FileAccess.Read, FileShare.Read, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
var handle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdoutFile, true);
if (handle.IsInvalid)
{
    throw new Win32Exception(Marshal.GetLastWin32Error());
}

if (!ExternalMethods.SetStdHandle(-11, handle))
{
    throw new Win32Exception(Marshal.GetLastWin32Error());
}
...