mmi*_*lan 20 .net c# unit-testing visual-studio visual-studio-2015
我发现我在VS2013中传递的一个测试在VS2015中失败了,测试调用了一个服务,其中包括调用 Console.Clear();
为了找出最新情况,我做了一个简单的单元测试
[TestMethod]
public void ExampleTest()
{
Console.Clear();
}
Run Code Online (Sandbox Code Playgroud)
此测试通过visual studio 2013,但在2015年我收到以下错误:
测试名称:ExampleTest测试FullName:solution.Common.Test.CacheManagerTest.ExampleTest测试源:C:\ solution.Common.Test\CacheManagerTest.cs:第34行测试结果:失败测试持续时间:0:00:00.3015003
结果StackTrace:在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
微软\ Framework.NETFramework\V4.5.1\mscorlib.dll中
编辑2:
Han*_*ant 15
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的变化旨在解决这个问题.
从技术上讲,您可以使用.runsettings文件配置单元测试,并使用该<ForcedLegacyMode>元素强制使用旧的测试主机进程.然而,这对该测试的结果没有影响,看起来他们以多种方式解决了这个问题.
这是一个相当多的猜测,我建议你使用connect.microsoft.com提交反馈报告.您可以引用此Q + A作为参考.
同时,您可以考虑解决方法.请注意,这Console.Clear()通常是一个麻烦制造者,当重定向控制台模式应用程序的输出时,它也会在正常使用中失败.从>操作员的命令行提示很容易做到.这是单元测试失败的最终原因.您需要使代码具有弹性,以便它可以在生产和单元测试中正常工作.像这样:
if (!Console.IsOutputRedirected) Console.Clear();
Run Code Online (Sandbox Code Playgroud)
这需要针对.NET 4.5或更高版本.如果您需要定位早期版本,可以使用此SO帖子中的代码.
| 归档时间: |
|
| 查看次数: |
4930 次 |
| 最近记录: |