TFS Fakes 构建单元测试失败

TFS Fakes Build Unit test failure

我们有一个 VS2013 .net 5.0 解决方案(VS2013 Premium),所有单元测试都在本地顺利通过,但是当 运行 在 VS Test Loader 中通过 TFS Build 进行 运行 时,有几个测试失败,有这个或类似的异常: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 更新到最新版本,即目前的 Update 5?

问题已通过在解决方案级别的测试项目之间共享伪配置文件得到解决

在我们的情况下,我们通过 Jenkins 中的 VSTest 运行 几个单元测试 DLL。

调用示例:

"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

一些测试项目对同一个 DLL 进行了 Fakes,大多数设置为 Fake everything。一个测试项目只伪造了一个 class,如下所示 XML,以防止关于 "Some fakes could not be generated."

的警告
<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="Utilities"/>
  <StubGeneration>
    <Clear />
  </StubGeneration>
  <ShimGeneration>
    <Clear />
    <Add FullName="UIUtils.ExceptionDisplay"/>
  </ShimGeneration>
</Fakes>

出于某种原因,VSTest 将上述版本用于其他测试项目。修改一个测试项目以生成所有假货修复了 System.TypeLoadException 的问题。我们可能会在未来合并我们的 Fakes,以便能够更轻松地限制哪些 classes 是伪造的,但目前这是解决问题的更快方法。

要是有更简单的方法来抑制 "Some fakes could not be generated" 警告就好了...

在多个单独的单元测试项目中使用垫片时遇到类似的问题。显然,生成的垫片可以覆盖每个垫片或类似的东西。

这是我修复它所遵循的说明:滚动到此页面的中间:https://msdn.microsoft.com/en-us/library/hh708916.aspx

它在优化构建时间的标题下,但也可以用它来解决您的问题。

由于此类程序集在您的机器上很少更改,因此您可以在其他项目中重用生成的 Fakes 程序集。从您的单元测试项目中,您可以简单地参考 已编译的 Fakes 程序集位于 FakesAssemblies 下 在项目文件夹中。

  • 创建新的 Class .NET 运行时版本匹配的库 你的测试项目。我们称它为 Fakes.Prebuild。去除那个 class1.cs 来自项目的文件,不需要。

    添加对您需要的所有系统和 third-party 程序集的引用 假货。并生成假货,如果您愿意,可以编辑 .fakes 文件, 并构建以生成假程序集。

    来自你的单元测试项目只要确保你有一个参考 到 Fakes 运行时 DLL:C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

    然后为您为其创建假货的每个程序集添加一个 引用中相应的 DLL 文件 Fakes.Prebuild\FakesAssemblies 项目的文件夹。 (这个文件夹 编译时创建)

    确认您需要通过浏览将引用添加到 生成假程序集..