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# VS2017.NET标准库中的单元测试内部方法_C#_Unit Testing_Visual Studio 2017_.net Standard - Fatal编程技术网

C# VS2017.NET标准库中的单元测试内部方法

C# VS2017.NET标准库中的单元测试内部方法,c#,unit-testing,visual-studio-2017,.net-standard,C#,Unit Testing,Visual Studio 2017,.net Standard,我目前正在通过创建一个.NET标准1.6库来使用最新的Visual Studio 2017发行候选版本。我正在使用xUnit对我的代码进行单元测试,我想知道您是否仍然可以在VS2017中测试内部方法 我记得您可以在VS2015中的AssemblyInfo.cs类中添加一行,使指定的项目能够查看内部方法: [assembly:InternalsVisibleTo("MyTests")] 由于VS2017.NET标准项目中没有AssemblyInfo.cs类,我想知道您是否仍然

我目前正在通过创建一个.NET标准1.6库来使用最新的Visual Studio 2017发行候选版本。我正在使用xUnit对我的代码进行单元测试,我想知道您是否仍然可以在VS2017中测试内部方法

我记得您可以在VS2015中的AssemblyInfo.cs类中添加一行,使指定的项目能够查看内部方法:

[assembly:InternalsVisibleTo("MyTests")]
由于VS2017.NET标准项目中没有AssemblyInfo.cs类,我想知道您是否仍然可以对内部方法进行单元测试?

根据:

该属性将应用于程序集级别。这意味着它可以包含在源代码文件的开头,也可以包含在VisualStudio项目的AssemblyInfo文件中

换句话说,您只需将其放入自己的任意命名的.cs文件中,即可正常工作:

// some .cs file included in your project
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
“InternalsVisibleTo”属性对于.Net的任何类型的“白盒”(我猜是十年中的术语)测试都是关键。它可以放在任何前面带有“assembly”属性的c#文件中。请注意,MS文档指出,如果已签名,则程序集名称必须由公钥令牌限定。有时这是行不通的,必须使用完整的公钥。访问内部构件是测试并发系统和许多其他情况的关键。看见在本书中,Meszaros描述了各种基本上构成程序开发“测试设计”方法的编码风格。至少这是我多年来使用它的方式

增加:
对不起,我有一阵子没在这儿演出了。一种方法被Meszaros称为“测试子类”方法。同样,必须使用“internalsvisableto”来访问基类的内部。这是一个很好的解决方案,但它不适用于密封类。当我教授“为测试而设计”时,我建议这是需要“预先设计”到基类中以提供可测试性的事情之一。它几乎已经成为一种文化现象。设计一个未密封的“基”基类。称之为未密封的基类或统一可识别的东西。这是要进行测试的子类。它也是构建生产密封类的子类,生产密封类通常只在它公开的构造函数中有所不同。我在核工业工作,对测试要求非常重视。所以,我必须一直思考这些事情。顺便说一下,在我们的领域中,将测试挂钩留在生产代码中并不被认为是一个问题,只要它们在.Net实现中是“内部的”。不测试某些东西的后果可能非常深远。

而第一个答案是非常好的。如果您仍然希望在原始的
AssemblyInfo
中执行此操作,您可以始终选择不自动生成文件并手动添加它

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

假的
有关更多信息:

另一种方法是在目标项目中使用一个“包装器”TestMyFoo公共类,该类具有公共方法并从需要测试的类(例如MyFoo)继承。这些公共方法只是调用要测试的基类

它不是“理想的”,因为您最终在目标项目中提供了一个测试挂钩。但考虑现代可靠的汽车与诊断端口和现代可靠的电子船与JTAG连接。但是没有人愚蠢到使用诊断端口驾驶汽车。

如下所述:

可以通过添加另一个ItemGroup在项目文件中添加内部可见属性:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

$(AssemblyName).Tests
甚至:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
        <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

$(MSBuildProjectName)。测试

我喜欢这个解决方案,因为项目文件似乎是定义这些问题的正确位置。

您应该能够仅从外部可见的功能对代码进行单元测试。毕竟,如果没有来自外部代码的逻辑路径可以到达这些内部方法,那么它们首先会在那里做什么?@David我可以并且已经这样做了,但是我之前已经在一些内部类周围进行了简单的单元测试。为了在testing.AFAIK中更加明确,您可以将此属性放置在
命名空间
块之外的任何其他文件中,并且应该编译它。
AssemblyInfo.cs
应该没有什么神奇之处。这不管用吗?当然,如果要创建包含内部类的库,并且需要测试和模拟这些类,则需要添加正确的
using
子句或使用完全限定属性
[assembly:System.Runtime.CompilerServices.InternalsVisibleTo(“某物”)]
@David,
InternalsVisibleTo
非常重要-例如这里-@PhilMurray:另外,似乎有一个设置允许您创建一个“经典”的
AssemblyInfo.cs
文件。否则,所有属性(如“description”、“copyright”和其他内容)都会存储在.csproj文件中。