是否可以在像 resharper 这样的无头单元测试运行器中托管一个 windows 控制台?
Is it possible to host a windows console in a headless unit testing runner like resharper?
我有一个针对控制台应用程序的软件库。我想要 运行 一组精简的集成测试,它们在无头 运行ner 中使用 windows 控制台,理想情况下 运行 在我们的构建服务器和 resharper 中测试 运行 纳尔。
为了完成这项工作,我需要在测试中执行实际的 System.Console
调用(因此它们不能被有条件地注释掉。)
当测试调用需要标准输出句柄的内容时,例如Console.SetCursorPosition
,产生异常:System.IO.IOException: 'The handle is invalid'
我假设我可以做一个 pinvoke 并调用 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());
}
我终于成功了。有必要创建一个带有 CREATE_NO_WINDOW 标志的子进程,等待该进程启动一个新的控制台会话,然后附加到该子进程。
我有一个针对控制台应用程序的软件库。我想要 运行 一组精简的集成测试,它们在无头 运行ner 中使用 windows 控制台,理想情况下 运行 在我们的构建服务器和 resharper 中测试 运行 纳尔。
为了完成这项工作,我需要在测试中执行实际的 System.Console
调用(因此它们不能被有条件地注释掉。)
当测试调用需要标准输出句柄的内容时,例如Console.SetCursorPosition
,产生异常:System.IO.IOException: 'The handle is invalid'
我假设我可以做一个 pinvoke 并调用 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());
}
我终于成功了。有必要创建一个带有 CREATE_NO_WINDOW 标志的子进程,等待该进程启动一个新的控制台会话,然后附加到该子进程。