使用Microsoft Fakes Framework的测试失败,但异常:Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationException:无法从COR_PROFILER_PATH和COR_PROFILER环境变量解析探查器路径
VS解决方案和构建最初是在VS 2012中创建的,并且在TFS 2012构建/控制器下运行良好,但不在TFS 2013下.我确实在TFS 2013构建服务器上安装了Ultimate VS 2012和Ultimate VS 2013.在解决此问题时,我将构建定义中的测试设置从使用"Visual Studio Test Runner"更改为"MSTest.exe Test Runner(VS 2010 Compatible)",现在无法将其更改为"Visual Studio Test Runner"在选择下拉中不再是一个选项.我甚至将TFS 2013中的构建模板替换为TFS 2012中的构建模板,但在编辑测试运行时,"Visual Studio Test Runner"仍然不是构建定义Process\Automated Tests部分中下拉选项的选项.
如何解决问题并获得使用Microsoft Fakes在TFS 2013构建中运行的测试?
microsoft-fakes visual-studio-2012 tfs2012 visual-studio-2013 tfs2013
我的项目有1000多个单元测试,在本地机器上,所有测试都在不到10秒的时间内完成.但是当他们在TFS Build上运行时,某些测试的运行速度明显慢于其他测试.其中3个在大约1-2分钟内运行,其他4个在5-30秒内运行,其他的则在几分之一秒内运行.我注意到所有那些较慢的测试都使用来自Microsoft Fakes的假货,而且每一个都是第一个在它的类中运行的.但是很多其他测试也使用假货(一些更密集)并且定期运行.我想知道可能导致这种减速的原因以及如何解决这个问题.
编辑:我注意到,在无模拟测试之后,每个较慢的测试都会运行.也许这种减速是由ShimsContext的初始化引起的.在我的测试类中,ShimsContext是在TestInitialize和TestCleanup方法上创建和处理的.这会对性能产生重大影响吗?
当我开始使用Microsoft Fakes时,我很高兴开始填补一些.NET方法.我一直相信我能够使用任何.NET方法,静态或不是:http://msdn.microsoft.com/en-us/library/hh549176.aspx.
但是,我一直试图在TcpClient中填充一些方法,只创建了存根,这对我没有好处,因为我希望能够改变一些方法来返回我自己的数据,而不是依赖于直播TcpClient给我数据.
如果还有其他超越Microsoft Fakes的方法,我愿意接受有关如何执行此操作的任何建议.
编辑:添加代码来演示问题
[TestMethod]
public void CommunicationTest()
{
var stubbedTcpClient = new System.Net.Sockets.Fakes.StubTcpClient
{
};
//No such ShimTcpClient exists
var shimmedTcpClient = new System.Net.Sockets.Fakes.ShimTcpClient
{
};
}
Run Code Online (Sandbox Code Playgroud) 我在使用Microsoft假货的解决方案中有一个单元测试项目,当我构建它时会得到以下错误.它抱怨无法加载的DLL在磁盘上.我已经打开Fusion日志并且表明绑定成功,所以现在卡住了.其他任何人都有假装问题?
could not load assembly Logging at C:\src\Application\Development\Main Development Branch\Source\Common Library\Logging\bin\Debug\Logging.dll
Run Code Online (Sandbox Code Playgroud) 我在我的Visual Studio 2012单元测试项目中添加了一个Fakes程序集,对应于我的应用程序项目(被测系统),如Peter Provost的文章中所述.但是,由于生成的Fakes代码中未解析的类型引用,项目将不再构建:
The type or namespace name 'FieldDefinition' does not exist in the namespace 'bc::ProductStudio' (are you missing an assembly reference?)
[C:\Users\arvek\Projects\Project\Project.Tests\obj\Debug\Fakes\bc\f.csproj]
C:\Users\arvek\Projects\Project\Project.Tests\f.cs
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?据我所知,这应该只是起作用,所以在我看来Fakes设施中存在一个错误.
将Microsoft Fakes程序集添加到测试项目中很容易:只需右键单击references部分中的父程序集,然后选择"Add Fakes Assembly".但是,当父程序集公共接口更改(新接口,新方法)时,伪造程序集会变得过时.
当我再次右键单击父组件时,我很乐意看到"替换假装组件"或"更新假装组件",但我看到的只是"添加伪装配".
添加Fakes程序集时选择"Add Fakes Assembly"会导致错误:
伪装配已经引用.Fakes程序集已经在参考列表中.删除.Fakes参考,然后重试.
按照说明操作,然后选择"添加伪装配"后,会发生同样的错误.
我可以通过删除Fakes目录(.fakes)中相应的xml文件来解决这个问题.
因此,在成功更新fakes程序集之前,我必须手动删除两个项目(fakes程序集和fakes xml文件).
有更简单或更直接的方法吗?
我想用它来伪造System.Net.Mail.SmtpClientMS-Test UnitTest.因此我添加了一个Fizz Assembmly of System.dll.然后我创建一个ShimsContext和一个StubSmtpClient.
using (ShimsContext.Create())
{
StubSmtpClient client = new StubSmtpClient();
}
Run Code Online (Sandbox Code Playgroud)
但是我该怎么做呢?最终目标是编写一个Test,它期望使用对象调用send方法MailMessage.
我正在使用Microsoft Fakes来填充几个WindowsAzure组件进行测试.按照vs 2012中的建议: Shims 编译,我更新了我的.fakes文件,只生成我实际需要的垫片:
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="false">
<Assembly Name="Microsoft.WindowsAzure.Storage" Version="2.1.0.0"/>
<StubGeneration>
<Clear/>
</StubGeneration>
<ShimGeneration>
<Clear/>
<Add FullName="Microsoft.WindowsAzure.Storage.CloudStorageAccount"/>
<Add FullName="Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient"/>
<Add FullName="Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer"/>
<Add FullName="Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob"/>
<Add FullName="Microsoft.WindowsAzure.Storage.Queue.CloudQueueClient"/>
<Add FullName="Microsoft.WindowsAzure.Storage.Queue.CloudQueue"/>
</ShimGeneration>
</Fakes>
Run Code Online (Sandbox Code Playgroud)
但我仍然得到"一些假货无法生成......"的警告.正在生成所有指定的填充程序,并且对上述任何行进行注释会导致我的测试项目无法构建.如果我打开诊断程序,我会看到许多消息,例如:
Warning 2 Cannot generate shim for Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient+<>c__DisplayClass1: type is not supported because of internal limitations.
Run Code Online (Sandbox Code Playgroud)
一切正常,我只想抑制警告,以免混淆我们的CI服务器.是否有非诊断消息的警告编号,我可以直接在测试项目中忽略?
最初我们在复杂的解决方案中发现了这个问题,但现在我也可以在虚拟项目中重现它.
如果我在VS2012 premium(更新4)中创建项目并为其中一个引用添加Fakes程序集,那么无论是否有任何更改,项目似乎都会重建.即我构建项目然后再次单击构建按钮将导致重建项目.
打开诊断构建信息,似乎问题的根本原因是编译.fakes文件的工具正在触摸.Fakes.dll文件,因此VS认为某些内容已更改:
1>Using "Touch" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1>Task "Touch" (TaskId:11)
1> Task Parameter:
1> Files=
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig
1> D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\mscorlib.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1> Touching "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.fakesconfig". (TaskId:11)
1>Done executing task "Touch". (TaskId:11)
[...]
1>Input file "D:\work\Ch24_2014_PreEC\UnitTestProject1\FakesAssemblies\System.4.0.0.0.Fakes.dll" is newer than output file "obj\Debug\UnitTestProject1.pdb".
Run Code Online (Sandbox Code Playgroud)
请告诉我我做错了什么以及如何解决这个问题,以便项目不会一直冗余地重建.
提前致谢
编辑
为了澄清,以下是重现问题的步骤:
请注意,您不必向解决方案添加单行代码.
microsoft-fakes ×10
c# ×6
unit-testing ×3
.net ×1
moles ×1
mstest ×1
tfs ×1
tfs2012 ×1
tfs2013 ×1