我们有一个VS2013 .net 5.0解决方案(VS2013 Premium),所有单元测试在本地都很好,但是在TFS Build中使用此类似异常的VS Test Run Loader运行时,多次测试失败:System.TypeLoadException: Could not load type 'System.Diagnostics.Fakes.ShimEventLog' from assembly 'System.4.0.0.0.Fakes, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0ae41878053f6703'.
这是一个失败测试的例子:
[TestMethod]
public void WriteToEventLogTest_HappyPath()
{
EventLogEntryType eTypeInfo = EventLogEntryType.Information;
bool sourceExistCalled = false;
bool writeEntrycalled = false;
using (ShimsContext.Create())
{
ShimEventLog.SourceExistsString = s =>
{
sourceExistCalled = true;
return true;
};
ShimEventLog.AllInstances.WriteEntryStringEventLogEntryType = (@this, str, et) =>
{
writeEntrycalled = true;
};
Logging.WriteToEventLog(IpAddress, eTypeInfo);
Assert.IsTrue(sourceExistCalled, "SourceExist() not called");
Assert.IsTrue(writeEntrycalled, "WriteEntry() not called");
}
}`
我们使用在Windows Server 2012 R2上运行的TFS 2013更新5。有什么可能导致这个问题吗?我们是否应该将TFS更新为最新的更新5?
答案 0 :(得分:3)
通过在解决方案级别的测试项目之间共享伪造配置文件来解决问题
答案 1 :(得分:0)
在我们的情况下,我们在Jenkins中通过VSTest运行了几个单元测试DLL。
示例电话:
.content-menu-menu {
float: none;
text-align: center;
list-style-type: none;
padding:0;
}
.content-menu-menu > li {
color:white;
padding-top: 10px;
}
.content-menu-menu > li > a > img {
width: 32px;
height:32px;
margin-right: 10px;
}
一些测试项目对同一个DLL有伪造,大多数设置为伪造一切。一个测试项目只是伪造一个类,如下面的XML所示,以防止关于&#34的警告;有些假货无法生成。"
"c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"
"./TestDLL1.UnitTests/bin/Debug/TestDLL1.UnitTests.dll"
"./TestDLL2.UnitTests/bin/Debug/TestDLL2.UnitTests.dll"
"./TestDLL3.UnitTests/bin/Debug/TestDLL3.UnitTests.dll"
/Enablecodecoverage /UseVsixExtensions:false /Logger:trx
出于某种原因,VSTest将上述版本用于其他测试项目。修改一个测试项目以生成所有假货修复了System.TypeLoadException的问题。我们可能会在未来巩固我们的假货,以便能够更容易地限制伪造哪些类别,但是现在这是一个更快的解决方案。
如果只有一种更简单的方法可以抑制"有些假货无法生成"警告......
答案 2 :(得分:0)
在多个单独的单元测试项目中使用Shims时遇到类似的问题。显然,生成的垫片可以覆盖每个或类似的东西。
以下是我修复此问题的说明:滚动到此页面的中间位置:https://msdn.microsoft.com/en-us/library/hh708916.aspx
它位于优化构建时间的标题下,但也用它来解决您的问题。
由于此类程序集很少在您的计算机上更改,因此您可以在其他项目中重用生成的Fakes程序集。从您的单元测试项目中,您可以简单地参考 已编译的Fakes程序集放在FakesAssemblies下 在项目文件夹中。
使用.NET运行时版本匹配创建新的类库 你的测试项目。我们称之为Fakes.Prebuild。除掉 来自项目的class1.cs文件,不需要。
添加对所需的所有系统和第三方程序集的引用 假货。并生成假货,如果你愿意,编辑.fakes文件, 并构建以生成假装配。
从单元测试项目中确保您有参考 到Fakes运行时DLL:C:\ Program Files \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ PublicAssemblies \ Microsoft.QualityTools.Testing.Fakes.dll
然后,对于您创建Fakes for的每个程序集,添加一个 引用相应的DLL文件 您项目的Fakes.Prebuild \ FakesAssemblies文件夹。 (这个文件夹 在编译时创建)
确认您需要通过浏览添加引用 生成假装配..