考虑一个.NET类库,其针对以下框架进行目标设置:
假设所有目标框架下的外部API都相同,但每个单独的目标框架都有一些特定于该框架的代码,那么我应该如何编写正确的单元测试以覆盖所有目标框架的代码?
我正在运行Visual Studio 2017 Community。
我在GitHub上准备了一个最小化的示例https://github.com/airbreather/MultiTargetDemo,这是我目前发现的可能是我现在可以做到的最好的,但这似乎不是正确的方法。一些缺陷:
此外,请注意,该库中的测试类实际上使用了一些在所有目标平台上都不可用的内容:
实际用例是NetTopologySuite,它已经针对多个完整框架平台和一些PCL进行了优化;有一个一年前的问题要求使其与.NET Core一起工作。我一直在断断续续地努力尝试让它在一个月左右的时间内实现,现在终于遇到了这个问题。
我发现另一个问题:使用.NET Core和xUnit同时针对多个框架进行单元测试代码,这确实与此问题相似。但是有几点不同:
- .NET Framework 2.0
- .NET Framework 4.6
- .NET Standard 1.0
- .NET Standard 1.3
- .NET Portable Profile336
假设所有目标框架下的外部API都相同,但每个单独的目标框架都有一些特定于该框架的代码,那么我应该如何编写正确的单元测试以覆盖所有目标框架的代码?
我正在运行Visual Studio 2017 Community。
我在GitHub上准备了一个最小化的示例https://github.com/airbreather/MultiTargetDemo,这是我目前发现的可能是我现在可以做到的最好的,但这似乎不是正确的方法。一些缺陷:
- 每个目标框架都需要单独的.csproj文件,需要大量复制粘贴。
- 使用一个名为
ReferringTargetFrameworkForProjectReferences
的未经充分记录的属性。- *这有点低调...目前在谷歌上搜索它,除了Microsoft的SDK材料外,什么也没有。
似乎不能正确地与.NET Standard shims一起使用(.NET Standard 1.3在此处抛出运行时错误,尝试查找。(编辑:我已经弄清楚了,这是corefx issue #16322,有一个笨拙的解决方法。)System.IO.FileSystem
)
此外,请注意,该库中的测试类实际上使用了一些在所有目标平台上都不可用的内容:
System.Threading.Tasks.Task<TResult>
在.NET Framework 2.0上不可用...这充当了测试本身可能用于自己目的的任何内容的代理,这些内容可能在正在测试的目标框架中不一定可用。实际用例是NetTopologySuite,它已经针对多个完整框架平台和一些PCL进行了优化;有一个一年前的问题要求使其与.NET Core一起工作。我一直在断断续续地努力尝试让它在一个月左右的时间内实现,现在终于遇到了这个问题。
我发现另一个问题:使用.NET Core和xUnit同时针对多个框架进行单元测试代码,这确实与此问题相似。但是有几点不同:
- 那个问题使用了VS2015时代的预览SDK工具(
project.json
)。这个问题涉及到VS2017时代的非预览工具,具有漂亮的.csproj
文件等。 - 可以通过为测试项目本身多目标定位一个“测试”目标框架来解决该问题,每个目标框架都针对“被测试对象”所针对的框架。看起来这个问题无法以类似的方式解决,特别是针对不寻常的Profile336目标。
- 此外,鉴于完整的.NET Framework 4.6可以引用任何列出的五个目标框架之一的程序集,因此我不需要将基本测试类的实现限制在仅可用于所选抓取的任何目标框架的交集中。
- 我尝试过像在
TargetFrameworks
中列出合成内容,例如test1; test2; test3; test4; test5
,然后强制将TargetFrameworkIdentifier
+TargetFrameworkVersion
设置为.NETFramework + 4.6,但我没有取得太大的成功(尝试获取xunit
包时失败)。但是我对此也没有尝试过太努力。