単体テストの目的で別のアセンブリのクラスにアクセスする方法は?
-
06-07-2019 - |
質問
Visual-Studio 2008の方法の単体テストに飛び込み、テスト目的でのクロスアセンブリ class
アクセスを達成するための最良の方法は何だろうと思います。
基本的に、1つのソリューションに2つのプロジェクトがあります:
- MyProject(C#)
- MyProjectTests(C#テストプロジェクト)
現在、MyProjectのすべてにデフォルトのアクセシビリティがあります。これを正しく思い出せば、すべてが事実上 internal
であることを意味します。私は主に class
レベルでテストしたいと思っていますが、いくつかのデリゲート
が関係しています。
おそらく将来、外部APIが登場するでしょうが、私は機能の完成までに少なくとも20%を費やしており(少なくとも紙の上では)、この未テストの上にさらにコードを重ねることにかなり不安を感じていますコア。したがって、アプリが従来の(テスト:悪いおよび/または怠zyな)機能テストを完了する前に、そして間違いなくバージョンn + 1外部APIが起動する前に、テストを行いたいと思います。
単純な答えに加えて、解決策の例は大歓迎です。
解決
アセンブリレベルの属性 InternalsVisibleToAttribute これを実現します。
追加
[assembly:InternalsVisibleTo("MyProjectTests")]
MyProjectアセンブリのAssemblyInfo.csに。
他のヒント
メインプロジェクトのAssemblyInfo.csに属性を追加し、名前付きアセンブリへの内部メソッドへのアクセスを許可することにより、内部メソッドをテストできます。
[assembly:InternalsVisibleTo(" MyProjectTestsNameSpace.MyProjectTests")]
詳細情報はですここ
追加する必要があります
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
" MyProject(C#)"のAssemblyInfo.csへ。これにより、テストはテスト用の内部メソッドにアクセスできます。
ただし、このアプローチにはお勧めしません-パブリックインターフェイスまたはAPIを介して内部クラスをテストします。
[InternalsVisibleTo]
はIMOの最も賢明な方法ですが、これについては少なくとも2つの方法があります:
-
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
このアプローチの問題は、メソッド名またはシグネチャが変更された場合、実行時に単体テストが失敗し始めるのに対し、 [InternalsVisibleTo]
はコンパイル時にこの重大な変更を簡単に選択できることです。時間。
これを見つけました https://msdn.microsoft.com/en -us / library / hh598957.aspx 誰かの助けになることを願っています。
概要:
- 単体テストプロジェクトで、テスト対象のコードへの参照を追加します。同じソリューションでコードプロジェクトへの参照を作成する方法は次のとおりです。
- ソリューションエクスプローラーでプロジェクトを選択します。
- 「プロジェクト」メニューで、「参照の追加...」を選択します。
- [参照マネージャー]ダイアログボックスで、[ソリューション]ノードを開き、[プロジェクト]を選択します。
- コードプロジェクト名を確認し、ダイアログボックスを閉じます。