質問: 現在cakePHP3を使ってアプリケーションを作っています。 そのプロダクトコードをテストするのにPHPUnitを使っているのですが、PHP自体初心者のため毎回手探り状態です。 テストコードを書く上で質問があるのですが、 **PHPUnitでメソッドを実行したかどうか確認するテストコードはどのように書けばいいでしょうか?** 状況としては Controllerクラスのテストをしようとしています。 そのindexアクションの中でgetHogeメソッドを呼んでいます。 getHogeメソッドのテスト自体は済んでいるので、 あとはindexアクションの中でgetHogeメソッドが呼ばれたこと(実行されたこと)を確認するテストコードを書きたいと思っています。 HogeController.php ``` public function index() { $this->getHoge(); } public function getHoge() { echo "hoge"; } ``` そのようなテストコードの書き方について知っている方がいらっしゃいましたらお教えいただけると助かります。 よろしくお願い致します。 --- 追記 以下サイトを参考にし、テストコードを書いたのですが、うまくいきませんでした。 具体的に言うと、 「Fatal error:Call to undifined method 〜」と言われてしまい、 このサイトで言う「error()」がモックオブジェクトに定義されていませんよ。と怒られているようなのです。 実際現場では require_once 'Sample.php'; としておらず、 テスト対象のクラスをインスタンス化してテストしているという違いはあるのですが、ほかは大体一緒です。 というよりそもそも**メソッドを実行したかどうかを確認するテストは必要ありますでしょうか?** カバレッジ的には変わりないように思うので不要かもしれないと思ってもきました。
回答: 自分も、いろいろと試してみましたが、参考にしたサイトのコードを流用すると、生成したMockにはgetHoge()メソッドのみが作成されて、index()メソッドは作成されてないようですね また、 >setMethods(array('index','redirect')) とすると、index()メソッドは作成されるのですがstubとなってしまうため、内部でgetHoge()を呼び出すことはできません もともとのコードはgetHoge()をprivateと考えることができると思うのですが、その場合privateメソッドはテストの対象とするべきではないという意見をStackOverflowに見つけたので、参考として貼っておきます Mock private method with PHPUnit この意見によれば、k499778さんが考えるように、あえてprivate(になりうる)メソッドをテストする必要はないと考えます