考虑一个面向以下框架的 .NET 类库:
让我们不要立即担心为什么这是目标框架的确切列表。
假设跨所有目标框架的外部 API 相同,但是 每个单独的目标框架都有一些该框架独有的代码,我如何正确编写涵盖所有目标框架代码的单元测试?
我正在运行 Visual Studio 2017 社区。
我在 GitHub 上制作了一个现成的最小示例,到目前为止我发现这可能是我现在能做的最好的:https://github.com/airbreather/MultiTargetDemo ,但这感觉不是正确的方法。一些缺陷:
ReferringTargetFrameworkForProjectReferences
的未充分记录的* 属性.System.IO.FileSystem
)。 (编辑:想通了,这是 corefx issue #16322 ,它有一点 awkward workaround )。 上面链接中的库正好有一个公共(public)类,上面正好有一个公共(public)实例方法。该方法有契约(Contract)义务只返回 32 位整数值 3,但它在每个目标上以完全不同的方式计算 3。显然,实际用例围绕着实现更多“有趣”的方法,但这足以进行对话。
此外,请注意,该库中的测试类实际上自己使用了一些并非在所有目标平台上都可用的东西:
System.Threading.Tasks.Task<TResult>
在 .NET Framework 2.0 上不可用...这只是测试本身可能用于其自身目的的任何东西的代理,这些东西可能不一定在正在测试的目标框架中可用。实际用例是NetTopologySuite ,它已经针对多个全框架平台和一些 PCL;有一个year-old issue要求使其与 .NET Core 一起工作。我一直在断断续续地尝试实现这一目标大约一个月,我终于跌跌撞撞地遇到了这个问题。
我发现了另一个问题:Unit testing code targeting several frameworks at once with .NET Core and xUnit ,确实和这个类似。这有几个不同的原因:
project.json
)。这个问题是指带有漂亮.csproj
的VS2017 时代的非预览工具。文件和所有。 TargetFrameworks
中列出合成的东西喜欢 test1;test2;test3;test4;test5
然后强制 TargetFrameworkIdentifier
+ TargetFrameworkVersion
到 .NETFramework + 4.6,但我没有取得多大成功(尝试获取 xunit
包时失败)。我也没试过太 然而,对此很难。 最佳答案
一、测试项目可以多目标也可以使用 <TargetFrameworks>
就像您用于图书馆的属性(property)一样。虽然 VS 测试运行器当前只显示/运行一个框架(具体来说是第一个),但任何对 dotnet test
的调用将执行所有框架(xunit 也在开发自定义控制台运行器 - dotnet xunit
- 以获得更好的控制台 UX)。
还要记住,测试项目需要指定具有 的目标框架。运行时 .因此,您的测试项目可以针对 netcoreapp*
或 net*
但从不netstandard*
因为它没有关联的运行时来运行测试。自从 Microsoft.NET.Tests.Sdk
以来,我不确定可移植目标。曾经测试项目需要引用以获得测试运行器支持不具备 NETPortable 的条件。
所以你需要选择net
的所有版本和 netcoreapp
您需要测试/支持 - 例如net20;net45;net46;netcoreapp1.0
将涵盖您所有的 .net 框架和 .net 核心版本。
有一种方法可以通过设置 Properties="TargetFramework=netstandard1.3"
来强制依赖特定的目标框架。在 <ProjectReference>
元素,但这对于恢复和多目标可能很难正常工作。
关于.net - 考虑到目标之间的实现差异,如何正确地对具有多个目标框架的 .NET 项目进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477840/