プライベート メソッドの単体テストはどこに置きますか?
-
19-09-2019 - |
質問
C# クラスのプライベート関数の単体テストはどこに配置しますか?
アン ウィキペディアの記事 示唆する:
- テストをテスト対象のメンバーと同じクラスに置く
- 部分クラスの使用
個人的には、これらの方法はどちらも適切ではないと思われるため、単体テストを完全に別のプロジェクトに配置することを好みます。
これについて何か考えはありますか?
(そもそもプライベート メソッドをテストする必要があるかどうかについては、かなりの議論があることは承知しています。双方の意見を聞きたいです。)
解決
民間の方法は、必ずしも直接テストする必要はありません。あなたは、これらのプライベートメソッドを利用publicメソッドのテストに基づいてその有効性を決定することができます。
しかし、あなたはあなたのパブリックメソッドが簡単に試験を容易にし、すべての合理的なシナリオをシミュレートするために、あなたのプライベートメソッドにモックの依存関係を注入することができることを保証するために注意する必要があります。
の編集のあなたの他のテストを配置する場所については、私はあなたのテストを処理するために、プロジェクト内の個別のサブディレクトリを示唆しています。 PHPアプリケーション用のテストを書くとき、私はをテストディレクトリ構造私の実際のアプリケーションのディレクトリ構造のものと同一である私のプロジェクトのルートにあるのディレクトリを持っています。その中で、私はそれぞれの実クラスのテストクラスを持っています。
ただ、生産に解放したときに、プロジェクトの残りの部分を使用してテストクラスをコンパイルしていない(またはPHPのように解釈言語の場合には、生産ウェブサーバにテストクラスを展開しません)。
他のヒント
ユニットテストのプライベートメソッドはしないでください。単体テストは、クラスの可視(SOパブリック及び保護された)インターフェイスをテストするためのものです。プライベートメソッドは、彼らのために実装の詳細と書き込みユニットテストされている不要です(彼らの行動は、暗黙的に見える方法のテストによってテストされなければならない)、脆いテストにつながる(実装の詳細が変更される可能性として)とリファクタリングへの障壁です。
あなたは、あなたはユニットテストに必要と感じプライベートメソッドを持っている場合は、、それは多分、それは別のクラスのパブリックメソッドに因数分解されるべきであるとの大きなヒントとなります。
あなたがC#クラスにプライベート機能のためのユニットテストを入れてくださいどこに?
どこにもありません。彼らは存在しません。
一般的には、私のユニットテストは、別のプロジェクトである。
私も個人的に別のプロジェクトでユニットテストをしてもらいたいです。 あなたはユニットテストにプライベートメソッドをしたい場合は、代わりにプライベートメソッドは、内部作ることができます。あなたはその後、AssemblyInfo.csに以下を追加することで直接呼び出すためにあなたのユニットテストに見える内部のメソッドを作ることができます:
[assembly: InternalsVisibleTo("MyAssembly.UnitTests")]
あなたはあなたのために働く何をすべき。ここに私のためにどのような作品です。
私のユニットはクラスである:それは私がテストしようとしているものです。ない方法。私は、オブジェクト指向プログラミングをやろうとしているので、私は、オブジェクトの上に私の注意を入れます。
私は自分自身のプライベートメソッドをテストするように誘惑見つけた場合は、、私はのリファクタリングのする必要があります。それとテストの間にあまりにも多くの他のコードがありますので、プライベートメソッド自体がテストの注意を必要とするのに十分複雑ですので、私は唯一の直接プライベートメソッドをテストしたいです。だから、私は通常、新しいクラスにしている民間の方法、およびその他の関連するメンバーを引っ張って、クラスを抽出します。
私のクラスには、のかなりの小さくなる傾向にあります。彼らは読んで理解しやすいです。私の方法は、もちろん、また、非常に小さく、理解しやすいです。
プログラミングについての私の前提や習慣の多くの再考のに私を必要な作業のこの方法への移行を作ります。かつて今ラジカル見えたことは当たり前のようです。
パブリック インターフェイスのみをテストする必要があるため、一般にプライベート メソッドはテストすべきではないという意見に私も同意します。
そうは言っても、プライベート メソッドをテストする必要がある理由は次のとおりです。
TDD を使用しているため、複雑なプライベート メソッドを開発する必要があります。テストの書き込み、コードの書き込み、テストのサイクルを適切な粒度で維持するには、プライベート メソッドのテスト メソッドの作成が必要になる場合があります。
あなたは、他の人がプライベート メソッドを変更する必要があるチームの一員であり、その変更によって問題が発生しないことをテストで確認したいと考えているかもしれません。
いくつかの解決策:
プライベート メソッドに委任し、テスト目的のみに使用されるパブリックなメソッドをいくつか宣言します。これらには接頭辞を付けることができます。TestFoo1、TestFoo2など
内部使用
http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx
あなたの質問のタイトルと最初の文は異なっています。 :)
私はあなたのテストをどこに配置するかについてはよく分かりません。それは、言語に依存するとC#が、私は精通してるものではありませんが、私はあなたのコードのかなりの部分が、プライベートメソッドの内部にあることを想像してみてください。それは試験しなかった場合、私は不快に感じると思います。コードカバレッジはかなり落とすでしょう。
Visual Studio でプライベート アクセサーを使用してプライベート メソッドをテストします。これは、テスト クラスが別のプロジェクト内に存在できることを意味します。
ただし、次の理由から、これらの数を実際に制限するように努めています。
- スタンドアロンで使用できるプライベート メソッドは、別のクラスのパブリック メソッドとして取り出すことができます。
- クラスの外部では特に有用なことを何も行わないプライベート メソッドは、そのクラスのパブリック メソッドを通じてテストできます。
絶対にはい。プライベートメソッドはとにかくテストする必要があります。そして MbUnitののユニットテストフレームワークは、プライベートメンバにアクセスすることができます。
このブログを参照してください。 プライベートメソッドをテストする