web-dev-qa-db-ja.com

プライベートメソッドの単体テスト-目的C

GHUnitを使用しています。プライベートメソッドを単体テストしたいのですが、それらをテストする方法がわかりません。私はプライベートメソッドをテストする理由とテストしない理由について多くの答えを見つけました。しかし、それらをテストする方法については見つかりませんでした。

私がプライベートをテストする必要があるかどうかについては話しませんが、それをテストする方法に焦点を当てます。

プライベートメソッドをテストする方法の例を誰かに教えてもらえますか?

38
Geek

Objective-Cのメソッドは実際にはプライベートではありません。取得しているエラーメッセージは、パブリックインターフェイスで宣言されていないため、呼び出しているメソッドが存在することをコンパイラが確認できないことです。

これを回避する方法は、クラスのカテゴリにプライベートメソッドを公開することです。これにより、メソッドが存在することをコンパイラに通知します。

したがって、次のようなものをテストケースファイルの先頭に追加します。

@interface SUTClass (Testing)

- (void)somePrivateMethodInYourClass;

@end

SUTClassは、テストを作成するクラスの実際の名前です。

これにより、プライベートメソッドが表示され、コンパイラの警告なしにテストできます。

107
Abizern

少し遅れましたが、TDD列車に乗りました。

プライベートメソッドはテストしないでください。パブリックメソッドをサポートするプライベートメソッドを記述するため、パブリックメソッドをテストすると、それらをサポートするプライベートメソッドが間接的にテストされます。

「プライベートメソッドはテストしないでください」という原則は、原則によってサポートされています"プライベートメソッドをテストする必要がある場合、これらのメソッドを別のクラスに移動する必要があることを意味します)公衆。

7
Lord Zsolt

@Lord Zsoltに同意する

また、次に注意してください(from Test-Driven iOS Development ISBN-10:0-321-77418-3、ISBN-13:978-0-321-77418-7)

プライベートメソッドのテスト

「プライベートメソッドをテストする必要がありますか?」または関連する質問「プライベートメソッドをどのようにテストすればよいですか?」 2番目の質問をする人々は、1番目の質問に対する答えが「はい」であると想定しており、現在、クラスのプライベートインターフェイスをテストスイートで公開する方法を探しています。

私の答えは、微妙な事実の観察に依存しています。あなたはすでにプライベートメソッドをテストしました。テスト駆動開発で一般的な赤、緑、リファクタリングのアプローチに従って、オブジェクトのパブリックAPIを設計して、それらのオブジェクトに必要な作業を実行しました。テストで指定された作業、および何も壊していないことを保証するテストの継続的な実行により、必要に応じてクラスの内部配管を自由に編成できます。実行しているのは、すでにテスト済みの動作をリファクタリングするだけなので、プライベートメソッドはすでにテストされています。

プライベートメソッドは、パブリックメソッドの実装をクリーンアップする機会がある場合にのみ作成されるため、テストされていない、またはテストが不完全な状況になることはありません。これにより、プライベートメソッドはクラスのパブリック動作をサポートするためだけに存在し、パブリックメソッドから確実に呼び出されるため、テスト中に呼び出す必要があります。

4
gbk

メソッドがプライベートの場合は、テストしないでください。

これについて考える。内部実装ではなく、メソッドの動作とコントラクトをテストする必要があります

2
seufagner