Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确测试库的.NET标准和核心版本?_C#_Unit Testing_.net Core_Nunit_.net Standard - Fatal编程技术网

C# 如何正确测试库的.NET标准和核心版本?

C# 如何正确测试库的.NET标准和核心版本?,c#,unit-testing,.net-core,nunit,.net-standard,C#,Unit Testing,.net Core,Nunit,.net Standard,背景: 我有一个库,它同时面向.NET标准2.0和.NET核心(以及其他)。由于.NET标准2.0缺少.NET核心/框架中存在的许多功能,因此我从.NET标准2.0版本的许多成员那里抛出PlatformNotSupportedException 第1期: UnitTest项目不能以.NET标准为目标,因此在测试项目中,我将.NET Core 2.0用于.NET Core和标准版本 在library.csproj中,我需要手动更改目标: library.csproj: net35;net40;ne

背景:

我有一个库,它同时面向.NET标准2.0和.NET核心(以及其他)。由于.NET标准2.0缺少.NET核心/框架中存在的许多功能,因此我从.NET标准2.0版本的许多成员那里抛出
PlatformNotSupportedException

第1期:

UnitTest项目不能以.NET标准为目标,因此在测试项目中,我将.NET Core 2.0用于.NET Core和标准版本

在library.csproj中,我需要手动更改目标:

library.csproj:
net35;net40;net45;netcoreapp2.0;netstandard2.0;netstandard2.1
test.csproj:
net35;net40;net45;netcoreapp2.0;netcoreapp3.0
第二期:

考虑到单元测试项目不能以.NET标准为目标,此代码不起作用:

[测试]
public void Tests某些内容在NetStandard20()中不可用
{
TestDelegate testCode=()=>。。。;
#如果NETSTANDARD2\u 0//这永远不是真的
抛出(testCode);
#否则
Assert.DoesNotThrow(testCode);
#恩迪夫
}
相反,现在我使用如下内容:

[测试]
public void Tests某些内容在NetStandard20()中不可用
{
TestDelegate testCode=()=>。。。;
#如果NETCOREAPP2_0//.NET Core 2.0或.NET Standard 2.0
如果(IsNetStandard20)
抛出(testCode);
其他的
Assert.DoesNotThrow(testCode);
#else//所有其他目标
Assert.DoesNotThrow(testCode);
#恩迪夫
}
...
//哎呀…:/
公共静态bool IsNetStandard20=>typeof(SomeTypeFromMyLib.Assembly.getReferencedAssemblys()
.Any(an=>an.Name==“netstandard”&&an.Version==新版本(2,0,0,0));
问题:

有没有一种方法可以测试.NET标准2.0版本,而不必一直更改.csproj文件(如果可能,还可以去掉
IsNetStandard20
属性)

免责声明:

我知道,通常情况下,提供一个.NET标准2.0版本来支持.NET Core应用程序就足够了,但不幸的是,它缺少了许多.NET Core 2.0所具有的功能(尽管这些功能包含在.NET标准2.1中,因此不需要单独的.NET Core 3.0版本)

UnitTest项目不能以.NET标准为目标,因此在测试项目中,我将.NET Core 2.0用于.NET Core和标准版本

这种说法并不完全正确。单元测试项目可以以.NETStandard为目标,但大多数测试平台无法找到或执行这些测试

可以在.NETCore进程中显式测试代码目标.NETCore。 另一方面,代码目标.NETStandard只能在使用实现指定版本的.NETStandard的运行时的进程中进行隐式测试。 如果您想测试后者,您需要在所有匹配的运行时上运行测试,您希望看到库的使用者使用这些运行时

如果您想让您的单元测试项目以target.NETStandard为目标,那么您应该查看。 这允许您根据.NETStandard构建单元测试,并让它们在实现所选.NETStandard版本的.NETCore和.NETFramework版本上执行

您可以像以前一样,将单元测试项目的目标定位在.NETStandard 2.0和.NETCoreApp 2.0。 您的测试将非常像您的第一个示例

[TestMethod]
无效测试NetStandard20()中不可用的内容
{
TestDelegate testCode=()=>。。。;
#如果NETSTANDARD2\u 0//则将其编译到网络标准测试程序集中
Test.If.ThrowsException(testCode,out PlatformNotSupportedException ex);
//抛出(testCode);
#else//这将编译到每个其他测试程序集中
Test.IfNot.ThrowsException(testCode,out PlatformNotSupportedException ex);
//Assert.DoesNotThrow(testCode);
#恩迪夫
}
这种方法将解决所描述的问题。
但是,由于单元测试平台的改变,它可能会带来新的问题。

谢谢您的回答。这项核试验看起来很有希望,因为它证明这个问题终究可以从根本上得到解决。不幸的是,我无法迁移到它,因为它与NUnit有着显著不同的API和特性。不过我还是选了你。很好的项目,格拉茨。谢谢。我希望有一天,这种执行测试程序集的方法会成为VST,这样我们就可以用.NETStandard编写测试了。除非有人能详细说明如何用另一种方法实现您想要的功能,否则请接受我的回答。好了,今天没有别的办法解决你的问题了。我对你的答案投了赞成票,但这并不能解决我的问题。“没有办法”似乎比“没有其他办法”更正确。