63

私はおもちゃのプロジェクトでテスト駆動開発を試しています。クラスへのパブリックインターフェイスでテストを機能させることができます(ただし、テスト対象のメソッドよりも多くのテストコードを記述しているため、まだ問題があります)。

パブリックインターフェイスをクリーンに保つのが好きなので、私は多くのプライベートメソッドを使用する傾向があります。ただし、これらのメソッドでテストを使用したいと思います。

Cocoaは動的言語であるため、これらのプライベートメソッドを呼び出すことはできますが、テストで、クラスがこれらのメソッドに応答しない可能性があるという警告が表示されます(明らかに応答しますが)。警告なしでコンパイルするのが好きなので、ここに私の質問があります:

  1. Xcodeでこれらの警告をオフにするにはどうすればよいですか?
  2. これらの警告をオフにするために他に何かできることはありますか?
  3. 「ホワイトボックス」テストを試す際に何か問題がありますか?
4

7 に答える 7

125

Objective-C には「プライベート メソッド」などというものは実際には存在しないことを思い出してください。それは、それが動的言語だからというだけではありません。設計上、Objective-C には ivar 用の可視性修飾子がありますが、メソッド用ではありません。任意のメソッドを呼び出すことができるのは偶然ではありません。

@Peterの提案は素晴らしいものです。彼の答えを補完するために、私が使用した代替手段(プライベートメソッドのためだけにヘッダーが必要ない/必要ない場合)は、単体テストファイル自体でカテゴリを宣言することです。(私@interface MyClass (Test)は名前として使用します。) これは、テスト対象のクラスがアクセスできる ivar にアクセスするためなど、リリース コードで不必要に肥大化するメソッドを追加するための優れた方法です。(プロパティが使用されている場合、これは明らかに問題ではありません。)

このアプローチにより、内部状態の公開と検証、およびテストのみのメソッドの追加が容易になることがわかりました。たとえば、この単体テスト ファイル-isValidは、バイナリ ヒープの正当性を検証する方法を記述しました。実稼働環境では、ヒープが有効であると想定しているため、このメソッドはスペースの無駄になります。コードを変更した場合に単体テストのリグレッションをテストするときにのみヒープを気にします。

于 2009-07-08T16:50:08.423 に答える
89

Xcodeでこれらの警告をオフにするにはどうすればよいですか?

しないでください。

これらの警告をオフにするために他に何かできることはありますか?

しないでください。

「ホワイトボックス」テストを試す際に何か問題がありますか?

いいえ。

解決策は、プライベートメソッドを独自のヘッダーのカテゴリに移動することです。このヘッダーを実際のクラスとテストケースクラスの実装ファイルの両方にインポートします。

于 2009-07-08T14:56:49.117 に答える
4

別の質問に答えがあるようです: Xcode で警告を抑制する方法はありますか?

于 2009-07-08T14:53:31.120 に答える
4

数日前にTDDを始めたとき、私は同じ問題に取り組んでいました。Test-Driven iOS Development bookで、この非常に興味深い視点を見つけました。

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

私の答えは、微妙な事実の観察に依存しています: あなたはすでにプライベート メソッドをテストしています。テスト駆動型開発で一般的な red-green-refactor アプローチに従うことで、オブジェクトが必要とする作業を行うようにオブジェクトのパブリック API を設計しました。テストによって指定されたその作業と、何も壊れていないことを保証するテストの継続的な実行により、適切と思われるようにクラスの内部配管を自由に編成できます。

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

于 2014-02-05T10:15:07.227 に答える
3

プライベート メソッドの実装を複数のソースファイルに分散させたくない場合、カテゴリ ソリューションを改良するには、既存のクラスと' 実装と関連する単体テスト ソース ファイル。

拡張機能を使用すると、プライベート メソッドの実装がメインの @implementation ブロックに存在しない場合に、コンパイラが警告することができます。このリンクはそれをうまく示しています。

于 2012-04-25T00:50:31.540 に答える
3

プライベート ヘッダーを持つか、独自のカテゴリを定義する方がおそらくより正しい解決策ですが、別の非常に単純な解決策もあります。メソッドを呼び出す前にオブジェクトを (id) にキャストします。

于 2009-07-12T20:17:50.877 に答える