使用 ITuple 生成假货时出错

Error generating fakes with ITuple

我们长期以来一直在我们的解决方案中使用 Microsoft Fakes 框架在测试期间伪造 System.DateTime.UtcNow。

最近,尽管几周前,我们开始使用 C# 7 功能(使用 VS 2017),包括元组作为函数的 return 值。现在,我为发布创建了一个新分支。在新分支中,生成假货失败并显示以下多个消息

4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,53): error CS0234: The type or namespace name 'ITuple' does not exist in the namespace 'System.Runtime.CompilerServices' (are you missing an assembly reference?) [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj] 4>C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\f.cs(116674,13): error CS0538: 'ITuple' in explicit interface declaration is not an interface [C:\Users\...\Source\... 2017\DEV\WebApp.UnitTests\obj\Debug\Fakes\m\f.csproj]

我试过这个:

我不确定还能尝试什么。当我们第一次开始使用元组并添加 System.ValueTuple NuGet 包时,我们没有遇到这个问题。我们只在创建新分支时才注意到这个问题。我想 FakesAssemblies 的构建或 NuGet 包的恢复一定触发了某些事情。

从那时起,我们在重建解决方案时也注意到它发生了。

编辑: 我还尝试删除所有 Fakes 程序集、引用和配置并重新开始。相同的结果。

解决方案原来是针对 .NET Framework 4.7.1 的。根据文档(RTFM,我知道...),ITuple 在该版本中首次在 System.Runtime.CompilerServices 中定义:

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.ituple(v=vs.110).aspx

.NET Framework

Available since 4.7.1

您可以忽略 mscorlib.fakes 文件中的 ITuple:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <StubGeneration>
    <Remove FullName="System.Runtime.CompilerServices.ITuple"/>
  </StubGeneration>
</Fakes>

*注意:<StubGeneration> 元素在 <ShimGeneration> 元素之前

我在引用 ITuple 时遇到了这些相同的错误,但我犯的错误导致了这些错误是相当愚蠢的。是什么修复了我的构建,对于可能犯了同样错误的其他人:

  • 验证声明的垫片是否在正确的 .fakes 文件中。例如,我的 DateTime 垫片:

    <ShimGeneration>
      <Add FullName="System.DateTime!" />
    </ShimGeneration>
    

    被意外地放在了 System.fakes 而不是 mscorlib.fakes。