c# - Visual Studio 2015 测试运行器中的 "The handle is invalid"异常

标签 c# .net visual-studio unit-testing visual-studio-2015

我发现我在 VS2013 中通过的测试之一在 VS2015 中失败了,该测试调用了一项服务,其中包括对 Console.Clear();

的调用

为了弄清楚发生了什么,我做了一个简单的单元测试

   [TestMethod]
    public void ExampleTest()
    {
        Console.Clear();
    }

此测试在 visual studio 2013 中通过,但在 2015 年出现以下错误:

Test Name: ExampleTest Test FullName: solution.Common.Test.CacheManagerTest.ExampleTest Test Source: C:\solution.Common.Test\CacheManagerTest.cs : line 34 Test Outcome: Failed Test Duration: 0:00:00.3015003

Result StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) at System.Console.Clear()
at sol.Common.Test.CacheManagerTest.ExampleTest() in C:\solution.Common.Test\CacheManagerTest.cs:line 35 Result Message:
Test method Alexandria.Common.Test.CacheManagerTest.ExampleTest threw exception: System.IO.IOException: The handle is invalid.

我明白,如果我的服务不是由控制台调用,它就会失败是糟糕的设计。我问这个问题的原因是想了解为什么这在新版本中会失败 Visual Studio 。这是预期的行为吗?发生了什么变化?

我在更改日志中没有看到任何与此相关的明显内容。

编辑:我从以下 dll 调用 Console.clear

Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll

编辑 2:

两个 Visual Studio 中的testproject属性图片 both visual studios

最佳答案

VS2015 中的变化非常明显,使用“测试”>“调试”>“所有测试”来深入了解。你可以看到它现在有一个新的测试主机进程,它的名字是TE.ProcessHost.Managed.exe。 ,存放在C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow目录下。

以前版本的 VS 使用不同的主机,vstest.executionengine.exe。新测试主机的一个显着变化是它不再是控制台模式程序。在 exe 上运行 Dumpbin.exe/headers 可以看到一些东西。

查看潜在问题的另一种方法是使用任务管理器。请注意在较旧的 VS 版本中运行测试如何导致 conhost.exe添加的过程。这是拥有控制台模式应用程序的控制台窗口的进程。我之前看到的一个问题是这个过程往往会泄漏,而不是在测试完成时终止。添加更多的 conhost.exe 实例,在研究这个问题时,我有 12 个实例在运行。据推测,VS2015 中的更改旨在解决该问题。

从技术上讲,您可以使用 a .runsettings file 配置单元测试并使用 <ForcedLegacyMode>强制使用旧测试主机进程的元素。然而,这对这次测试的结果没有影响,看起来他们以多种方式解决了这个问题。

这是相当多的猜测,我建议您使用 connect.microsoft.com 提交反馈报告。您可以引用此Q+A作为引用。


与此同时,您可以考虑一种解决方法。请注意 Console.Clear()通常是一个麻烦制造者,当控制台模式应用程序的输出被重定向时,它也会在正常使用中失败。使用 > 在命令行提示符下很容易做到运算符(operator)。这是它在单元测试中失败的最终原因。您需要使代码具有弹性,以便它可以在生产和单元测试中正常工作。像这样:

    if (!Console.IsOutputRedirected) Console.Clear();

这需要面向 .NET 4.5 或更高版本。您可以使用 this SO post 中的代码如果您需要针对早期版本。

关于c# - Visual Studio 2015 测试运行器中的 "The handle is invalid"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31692714/

相关文章:

c# - 将文件从 ASP.NET Core Web API 发布到另一个 ASP.NET Core Web API

.net - 连接到 AS400/DB2 时在 .NET 中使用 OLEDB 参数

c# - "ConvertPdbToMdb"任务意外失败

javascript - 将 js 转换为 C# 时出现 System.OverflowException

c# - 有条件地加入 Linq

c# - 静默安装 SQL Server 2008 服务包时抑制 UAC 帐户设置窗口

c# - 如何根据元素的位置使用 Linq 重命名数据?

c# - 这段代码能正确判断两种类型是否相等吗?

c# - 在什么情况下,C#中的赋值不能更改变量的值?

C++17 标准库包括不在 Visual Studio 2017 中使用 Android 项目