我发现我在 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:
最佳答案
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/