是否有可能在像reshaper的无头单元测试运行器中托管Windows控制台?

问题描述 投票:0回答:1

我有一个针对控制台应用程序的软件库。我想运行一套瘦身的集成测试,这些测试在无头赛跑者中使用Windows控制台,理想情况下,它们应在构建服务器和Resharper测试赛跑者中运行。

为了完成这项工作,我需要在测试中执行实际的System.Console调用(因此不能有条件地将其注释掉。)

[当测试调用需要stdout句柄的内容时,例如Console.SetCursorPosition,生成异常:System.IO.IOException: 'The handle is invalid'

我以为我可以打个电话然后调用FreeConsoleAllocConsole,这将允许我调用相关方法。不幸的是,事实并非如此。

目前,我可以成功释放,分配和将控制台输出重定向回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());
}
c# .net-core console-application integration-testing pinvoke
1个回答
0
投票

我最终完成了这项工作。必须使用CREATE_NO_WINDOW标志创建一个子流程,等到该流程开始新的控制台会话后再附加到该子流程。

© www.soinside.com 2019 - 2024. All rights reserved.