回答:
内部クラスをテストする必要があり、アセンブリ属性があります:
using System.Runtime.CompilerServices;
[assembly:InternalsVisibleTo("MyTests")]
これをプロジェクト情報ファイルに追加してくださいProperties\AssemblyInfo.cs
。
private
にしていますが、あまりにも多くのprivate
ものが、internal
抽出に苦労しているクラスを指し示している可能性があります。TDDまたはTDDなしの場合、同じ量のコードを実行するいくつかのテストよりも、多くのコードをテストするより多くのテストを行うことを好みます。そして、ものをテストするinternal
ことを避けることは、良い比率を達成するために正確に助けにはなりません。
#if DEBUG
、#endif
デバッグビルドでのみこのオプションが有効になります。
あなたはプライベートメソッドをテストしたい場合は、見ていPrivateObject
とPrivateType
でMicrosoft.VisualStudio.TestTools.UnitTesting
名前空間を。必要なリフレクションコードの周りに使いやすいラッパーを提供します。
ドキュメント: PrivateType、PrivateObject
VS2017および2019の場合、MSTest.TestFramework nugetをダウンロードしてこれらを見つけることができます
エリックの答えに加えて、csproj
ファイルでこれを構成することもできます。
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyTests</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
または、テストするプロジェクトごとに1つのテストプロジェクトがある場合、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
デフォルトではプライベートを使用してください。メンバーがそのタイプを超えて公開されるべきではない場合、同じプロジェクト内であっても、そのタイプを超えて公開されるべきではありません。これにより、安全で整然とした状態が維持されます。オブジェクトを使用している場合は、使用できるメソッドが明確になります。
そうは言っても、自然にプライベートなメソッドを内部的にテスト目的で作成するのは合理的だと思います。リファクタリングに適さないリフレクションを使用する方が好きです。
考慮すべき1つのことは、 "ForTest"サフィックスです。
internal void DoThisForTest(string name)
{
DoThis(name);
}
private void DoThis(string name)
{
// Real implementation
}
次に、同じプロジェクト内でクラスを使用している場合、このメソッドを実際に使用するべきではないことは明らかです(現在および将来)。テストの目的でのみ存在します。これは少しハックであり、私自身ではありませんが、少なくとも検討する価値はあります。
ForTest
アプローチを使用しますが、私はいつもそれが醜いことに気づきます(本番ビジネスロジックの観点から実際の価値を提供しないコードを追加します)。設計が非常に不幸であるため(つまり、テスト間でシングルトンインスタンスをリセットする必要があるため)、通常、このアプローチを使用する必要がありました
ForTest
は明らかに間違っていますが、メソッドを内部的にするだけの場合は問題なく使用できます。
プライベートも使用でき、リフレクションを使用してプライベートメソッドを呼び出すことができます。Visual Studio Team Suiteを使用している場合は、プライベートメソッドを呼び出すプロキシを生成する優れた機能がいくつかあります。以下は、プライベートメソッドと保護されたメソッドを単体テストするための作業を自分で行う方法を示すコードプロジェクトの記事です。
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
どのアクセス修飾子を使用する必要があるかについては、私の一般的な経験則は、プライベートから始めて、必要に応じてエスカレートすることです。そうすることで、クラスの内部の詳細を本当に必要なだけ公開し、実装の詳細を非表示にしておくことができます。
私が使用Dotnet 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>
これが誰かに役立つことを願っています!
System.Diagnostics.Debug.Assert()
、メソッド自体の内部で使用することにより、内部メソッドのユニットテストの必要性を回避できます。