2016-06-16 4 views
2

オブジェクト指向プログラミングに関するリソースを読むロジックは、できるだけ公開メソッド を回避することです。パブリックメソッドは、他のオブジェクトが私たちのクラスとやりとりするためのインターフェイスである を提供します。プライベート対パブリックメソッドとテスト可能なコード

このインターフェイスはできるだけシンプルで、実装の詳細はプライベートメソッド内に隠す必要があります。

私の質問はプライベートメソッドのテストできない性質のために発生します。

コードはテスト可能なはずですか?私は...

+0

[PHP:Public、Private、Protected]の重複している可能性があります(http://stackoverflow.com/questions/4361553/php-public-private-protected) –

+0

私はテストの大きな専門家ではありませんが、私的および/または保護されたメソッドをテストする問題があるとは思わない。 http://stackoverflow.com/questions/249664/best-practices-to-test-protected-methods-with-phpunit –

答えて

1

これら二つのアプローチは、一貫した開発アプローチに統合されているかを確認していない民間と保護公共の簡単な説明、:

  • 公共
  • 他のクラスによってアクセプライベート:他のクラスからアクセスできない
  • プロテクト:他のクラスからはアクセスできませんが、派生クラスからアクセス可能

オブジェクト指向プログラミングに関するリソースは、公開メソッドを可能な限り避けることです。

これは完全ではありません。メソッドがクラス内でのみ使用され、クラスによって公開されるインタフェースの一部でない場合、そのメソッドはプライベートである必要があります(または、クラスを拡張する場合は保護されている必要があります)。パブリックメソッドはインターフェイスの一部であり、他のクラスから呼び出されるように設計されたメソッドです。パブリックメソッドの使用を制限するよう強制しないでください。クラスが多くのパブリックメソッドを必要とする場合は、それを持つ必要があります。クラスの内部力学を外部世界に公開しないでください。あなたは大丈夫です。

リフレクションを使用して、テスト、プライベートおよび保護された方法についてをテストしてください。 Reflectionは、テスト目的などのために、メソッドのアクセサをプライベートからパブリックに変更することを可能にします。リフレクションの詳細を読むhere

1

パブリックメソッドをテストすることでクラスをテストできます。それが十分なカバレッジではなく、プライベートまたはプロテクトされたメソッドにまだ多くの機能がある場合は、別のクラスにする必要があります。

TTDを使用すると、すべてのメソッドがパブリックに開始され、プライベートメソッドは既に動作しテスト済みのコードからのみ再集計されるべきだと言う人もいます。

モックを使用する必要がある場合は、プライベートか保護をテストすることもできます。

+0

それはまだ私に混乱しています...プライベートメソッドを別のクラスに移動して、プライベートクラスとして公開することになります。 – orestiss

+0

@orestissクラスの内部力学は非公開のままです。これはあなたのクラスを "仕事"にするロジックですが、オブジェクトの外側には関係ありません。あなたがテストされるべきプライベートメソッドを見ているならば、そのクラスのSRPなどは論理を別のオブジェクトにエクストラクトする必要があるかどうかを指示します。時間があるなら、この本http://artofunittesting.com/を見てください - 正しい方向にあなたを押し進めるはずです。 .NETのコード例については心配する必要はありませんが、コンセプトについてはまだ理解しています。 – jakehallas

関連する問題