TFS伪造构建单元测试失败

时间:2015-09-11 14:26:18

标签: c# tfsbuild tfs2013

我们有一个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?

3 个答案:

答案 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文件夹。 (这个文件夹 在编译时创建)

    确认您需要通过浏览添加引用 生成假装配..