使用 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]
我试过这个:
- 将 Microsoft.Net.Compilers 2.4.0 NuGet 添加到所有项目
- 将所有项目升级到目标 .NET 4.7(从 4.6.1),并删除所有 System.ValueTuple 引用(因为它们现在内置于 .NET 4.7)
我不确定还能尝试什么。当我们第一次开始使用元组并添加 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。
我们长期以来一直在我们的解决方案中使用 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]
我试过这个:
- 将 Microsoft.Net.Compilers 2.4.0 NuGet 添加到所有项目
- 将所有项目升级到目标 .NET 4.7(从 4.6.1),并删除所有 System.ValueTuple 引用(因为它们现在内置于 .NET 4.7)
我不确定还能尝试什么。当我们第一次开始使用元组并添加 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。