Visual Studio 2015测试运行器中的“句柄无效”异常

24

我发现在VS2013中通过的一个测试在VS2015中失败了,该测试调用了一个包含调用Console.Clear();的服务,以便了解情况我进行了一项简单的单元测试。

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

这个测试在Visual Studio 2013中通过,但在2015中出现以下错误:

测试名称:ExampleTest 测试全名:solution.Common.Test.CacheManagerTest.ExampleTest 测试源:C:\solution.Common.Test\CacheManagerTest.cs : 第34行 测试结果:失败 测试持续时间:0:00:00.3015003

结果堆栈跟踪: 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded) 在 System.Console.Clear()
在 sol.Common.Test.CacheManagerTest.ExampleTest() 中 C:\solution.Common.Test\CacheManagerTest.cs:第35行 结果消息:
测试方法Alexandria.Common.Test.CacheManagerTest.ExampleTest引发了异常:System.IO.IOException:句柄无效。

我理解如果我的服务没有被控制台调用会导致设计不良的情况。 我问这个问题是为了了解为什么在新版本的Visual Studio中会失败。这是预期的行为吗?有什么变化吗?

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

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

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

编辑2:

测试项目在两个Visual Studios中的属性图片 both visual studios


不行。对我来说,这在Visual Studio 2010上失败了。你能在VS2013中再检查一下吗?右键单击你的项目,选择属性->选择应用程序选项卡->检查输出类型。它是否说类库? - gideon
@gideon 是的,它是一个类库 http://i.imgur.com/1Vedgyd.png 我正在使用 Microsoft Visual Studio Professional 2013 版本 12.0.31101.00,更新 4 - mmilan
@gideon 我还没有找到一种实际检查它是否清除控制台的方法。对我来说,在Vs2013中测试通过,但这毫无意义。 - mmilan
@OldFox 我编辑了问题,并提供了一个屏幕截图,更详细地说明了测试项目的设置。 - mmilan
@mmilan 我的项目(它也是 .net 4.5.1,和你的一样...)在 VS2013 中使用的是 Microsoft.NET\Framework\v4.0.30319\mscorlib.dll 而不是 Microsoft\Framework.NETFramework\v4.5.1\mscorlib.dll。所以可能微软对 Console 类进行了一些重构。我会安装 VS2015 并更新。 - Old Fox
显示剩余3条评论
1个回答

18

在VS2015中的变化非常明显,使用“Test> Debug> All Tests”可以获得见解。您可以看到它现在具有一个新的测试主机进程,名为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中的更改旨在解决这个问题。

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

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


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

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

需要针对.NET 4.5或更高版本进行定位。如果需要针对早期版本,请使用此SO帖子中的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接