2

パブリック メソッドとプライベート メソッドを持つクラスを単体テストしようとしていますが、プライベート (ベースで保護された抽象) として設定されている特定のメソッドを単体テストしたいと考えています。メソッドを公開することはできず、このメソッドをテストするために完全なプロセスを実行したくありません。このメソッドへの入力引数と戻り値が期待どおりであることだけが懸念されます。

この質問が強調するように、メソッドを公開したくありません。

プライベート メソッドを公開して単体テストを行う...いい考えですか?

私の質問は、プライベート メソッドをテストするさまざまな方法とは何か、どの手法を優先する必要があるのか​​、その理由は何ですか?

私はこの質問を読みました ( How do you unit test private Methods? ) が、受け入れられた回答がまだ最良の回答であるかどうか、または数年後にもっと良い方法があるかどうかを知りたいです。

この質問が「どのようにプライベート メソッドを単体テストしますか?」の重複と見なされる場合 そこにコメントを追加し、更新を依頼します。アドバイスしてください。

4

7 に答える 7

2

私はこの質問を読みました (どのようにしてプライベートメソッドを単体テストしますか?) が、受け入れられた回答がまだ最良の回答であるか、それとも数年後にはより良い方法があるかを知りたい.

私は受け入れられた答えを避けます。

内部のことは気にせずに、パブリック インターフェイスをテストすることについて大騒ぎすることもできますが、それは現実的ではないかもしれません。

私が見ることができる2つの即時のオプションがあります:

  • メソッドを確認するための反射、一種のハックですが、少なくとも何らかのテストを実行できます。これは、迅速に作業を開始する最も簡単な方法でもあります。
  • ストラテジー パターンなどを使用してプライベート メソッドの動作を抽象化し、その動作をオブジェクト自体に挿入します (または、オブジェクトを内部的newに関連する戦略に手動で設定します)。この個別の戦略項目は、個別にテストできます。

とはいえ、このような状況に頻繁に遭遇するべきではありません。その場合は、一歩下がって、クラスの設計方法を見直し、場合によってはクラスをよりオープンでテストしやすいものにするために見直す必要があります。

于 2013-05-30T10:27:15.853 に答える
0

VS 2005 以降を使用している場合は、次の手順を使用します。

  1. プライベート メソッドを含むソース コード ファイルを開きます。
  2. プライベート メソッドを右クリックし、[単体テストの作成] を選択します。[単体テストの作成] ダイアログ ボックスが表示されます。表示されているツリー構造では、private メソッドのチェック ボックスのみが選択されています。
  3. (オプション) [単体テストの作成] ダイアログ ボックスで、出力プロジェクトを変更できます。[設定] をクリックして、単体テストの生成方法を再構成することもできます。
  4. [OK] をクリックします。これにより、VSCodeGenAccessors という名前の新しいファイルが作成されます。このファイルには、テスト対象のクラスのプライベート エンティティの値を取得する特別なアクセサー メソッドが含まれています。ソリューション エクスプローラーのテスト プロジェクト フォルダーに新しいファイルが表示されます。この時点までにテスト プロジェクトに単体テストがなかった場合は、単体テストを格納するソース コード ファイルも作成されます。プライベート アクセサーを含むファイルと同様に、単体テストを含むファイルもソリューション エクスプローラーのテスト プロジェクトに表示されます。
  5. 単体テストを含むファイルを開き、プライベート メソッドのテストまでスクロールします。// TODO: コメントでマークされたステートメントを見つけ、コメントの指示に従って完成させます。これにより、テストでより正確な結果が得られます

詳細については、これを参照してください

内部的にはリフレクションを使ってプライベートメソッドを呼び出しているようです。しかし、それは機能します。

于 2014-02-21T09:02:46.180 に答える
0

プライベートメソッドの単体テストを行うべきではないことに気付くまで、私は実際にこの質問に対する答えを求めてここに来ました。これは、プライベート メソッドが、より大きなロジックの一部であるプロセスの一部であるためです。

単体テストは、クラスのインターフェースに対してテストすることを目的としています。クラスを意図したとおりに使用する場合、品質管理を保証する必要があるという考えです。結果として、プライベート メソッドを単体テストすることは役に立ちません。単純に、コンシューマ (実装者) に公開されることはないからです。消費者がクラスを使用できるケースに対して単体テストを行う必要があります。

プライベートなものを単体テストする必要がある場合は、そのメソッドの場所やコードの分割方法を再考する必要があるかもしれません。私は、プライベート メソッドを単体テストする必要がある場合、9/10 回は静的ユーティリティ クラスにラップできるメソッドであるという結論に達しました。

于 2015-03-05T17:36:55.787 に答える
0

反射を使用します。自分でリフレクションをいじりたくない場合は、Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll にある Microsoft の PrivateObject クラスを使用できます。しかし、MSTest と NUnit の連携には問題があります - MSTest と NUnit の両方を使用していますか?

于 2013-05-30T10:44:39.657 に答える
0

テストでプライベート メソッドを呼び出して、それがどのように機能するかを確認したいですか?

クラスから派生させ、テストするメソッドを呼び出すパブリック メソッドを追加できます。とてもシンプルです。プライベートメソッドのテストはお勧めしませんが。そうする理由は一つも思いつきません。私の考えを変える例を見てみたいです。

編集:この回答はまだトラフィックを獲得しているため、このリンクを共有します。このブログ投稿は、回答を投稿してから約 4 年後に作成されました: https://enterprisecraftsmanship.com/posts/unit-testing-private-methods/

于 2013-05-30T12:02:31.750 に答える