Her*_*Lie 419 .net c# tdd unit-testing
我是单元测试的新手,我正在试图弄清楚是否应该开始使用更多的"内部"访问修饰符.我知道如果我们使用'internal'并设置汇编变量'InternalsVisibleTo',我们可以测试我们不想从测试项目声明公共的函数.这让我觉得我应该总是使用'内部',因为至少每个项目(应该?)都有它自己的测试项目.你们能告诉我为什么不这样做吗?我什么时候应该使用'私人'?
Eri*_*fer 1121
需要测试内部类,并且有一个assemby属性:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
将其添加到项目信息文件中,例如Properties\AssemblyInfo.cs.
Bri*_*sen 118
如果你想测试私有方法,看一看PrivateObject,并PrivateType在Microsoft.VisualStudio.TestTools.UnitTesting命名空间.它们围绕必要的反射代码提供易于使用的包装器.
ihe*_*heb 82
从 .NET 5 开始,您还可以在csproj正在测试的项目的文件中使用此语法:
  <ItemGroup>
    <InternalsVisibleTo Include="MyProject.Tests" />
  </ItemGroup>
gld*_*ael 20
除Eric的答案外,您还可以在csproj文件中进行配置:
<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>MyTests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
或者,如果每个要测试的项目都有一个测试项目,则可以在Directory.Build.props文件中执行以下操作:
<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Test</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
参见:https : //stackoverflow.com/a/49978185/1678053
 
示例:https : //github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
Flo*_*ish 12
我正在使用.NET Core 3.1.101并且对我有用的.csproj附加功能是:
<PropertyGroup>
  <!-- Explicitly generate Assembly Info -->
  <GenerateAssemblyInfo>true</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
  <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
  <_Parameter1>MyProject.Tests</_Parameter1>
  </AssemblyAttribute>
</ItemGroup>
Ste*_*nke 11
您也可以使用私有,您可以使用反射调用私有方法.如果您使用的是Visual Studio Team Suite,它有一些很好的功能,可以生成一个代理来为您调用私有方法.这是一个代码项目文章,演示了如何自己完成工作以对私有和受保护方法进行单元测试:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
就您应该使用的访问修饰符而言,我的一般经验法则是私有,并根据需要升级.这样,您将尽可能少地公开您的类的内部细节,它有助于保持实现细节隐藏,就像它们应该的那样.
Jon*_*eet 10
默认情况下继续使用私有.如果成员不应暴露在该类型之外,则不应暴露在该类型之外,即使是在同一项目中也是如此.这样可以使事情变得更加安全和整洁 - 当您使用该对象时,您可以使用哪种方法更清晰.
话虽如此,我认为有时将自然私有方法内部用于测试目的是合理的.我更喜欢使用反射,这是重构 - 不友好.
要考虑的一件事可能是"ForTest"后缀:
internal void DoThisForTest(string name)
{
    DoThis(name);
}
private void DoThis(string name)
{
    // Real implementation
}
然后,当您在同一个项目中使用该类时,很明显(现在和将来)您不应该真正使用此方法 - 它仅用于测试目的.这有点hacky,而不是我自己做的事情,但它至少值得考虑.
| 归档时间: | 
 | 
| 查看次数: | 122242 次 | 
| 最近记录: |