CakePHP3とPHPUnitでの単体テストコードの勉強をするために簡単なコードを書いて実施してみた。
環境
CakePHP 3.6.3
PHPUnit 5.7.27
PHP 7.0.27
UsersController.phpにsum()を追加する。
sum()はGETまたはPOSTから渡されるパラメータa、bの値を足し算する。
//UsersController.php<br> public function sum()<br> {<br> $this ->request->allowMethod([ 'post' , 'get' ]);<br> if ( $this ->request->is( 'post' )) {<br> $a = $this ->request->getData( 'a' );<br> $b = $this ->request->getData( 'b' );<br> } elseif ( $this ->request->is( 'get' )) {<br> $a = $this ->request->getQuery( 'a' );<br> $b = $this ->request->getQuery( 'b' );<br> }<br> $this ->set( 'sum' , $a + $b );<br> } |
Controllerがsum()なのでsum.ctpテンプレートを追加する。
//Template/Users/sum.ctp<br> <?php<br> echo $sum ; |
UsersControllerTest.phpにはGETとPOST用のコードを作成する。
viewVariable()はControllerからset()した値を取得している。
//UsersControllerTest.php<br> public function testSumGet()<br> {<br> $this ->get( 'Users/sum?a=0&b=0' );<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(0, $sum );</p> <p> $this ->get( 'Users/sum?a=10&b=20' );<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(30, $sum );</p> <p> $this ->get( 'Users/sum?a=1000000&b=2000000' );<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(3000000, $sum );<br> }</p> <p> public function testSumPost()<br> {<br> $this ->post( 'Users/sum' , [ 'a' => 0, 'b' => 0]);<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(0, $sum );</p> <p> $this ->post( 'Users/sum' , [ 'a' => 10, 'b' => 20]);<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(30, $sum );</p> <p> $this ->post( 'Users/sum' , [ 'a' => 1000000, 'b' => 2000000]);<br> $sum = $this ->viewVariable( 'sum' );<br> $this ->assertEquals(3000000, $sum );<br> } |
PHPUnitを実行すると以下のような成功メッセージが出力される。
> php vendor\phpunit\phpunit\phpunit --coverage-html . /report .html tests\TestCase\Controller\UsersControllerTest.php |
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
.. 2 / 2 (100%)
Time: 1.91 seconds, Memory: 12.00MB
OK (2 tests, 6 assertions)
Generating code coverage report in HTML format ... done
・途中で手が止まった点
testSumGet()とtestSumPost()の2つ目以降のテストがエラーになっていた。
メッセージを見るとControllerから受け取る$sumがnullになっていた。
原因はTemplate/Users/sum.ctpを作成していなかったため。
cli-error.logにテンプレートファイルが見つからないエラーが出ていた。
・今回解決できなかった点
UsersController.phpのsum()はGETとPOST以外は許容していない。
allowMethod()で指定したメソッド以外のアクセスは
500エラーが返るのでassertResponseFailure()を使ったテストコードを作った。
その結果、テストコードは成功した。
しかし、カバレッジレポートが生成されるがテストが通過したことにならなかった。
コメント