CakePHP3とPHPUnitでControllerの単体テストを実施してみた

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-&gt;request-&gt;allowMethod(['post', 'get']);<br>
    if($this-&gt;request-&gt;is('post')) {<br>
        $a = $this-&gt;request-&gt;getData('a');<br>
        $b = $this-&gt;request-&gt;getData('b');<br>
    } elseif ($this-&gt;request-&gt;is('get')) {<br>
        $a = $this-&gt;request-&gt;getQuery('a');<br>
        $b = $this-&gt;request-&gt;getQuery('b');<br>
    }<br>
    $this-&gt;set('sum', $a + $b);<br>
}

Controllerがsum()なのでsum.ctpテンプレートを追加する。

//Template/Users/sum.ctp<br>
&lt;?php<br>
echo $sum;

UsersControllerTest.phpにはGETとPOST用のコードを作成する。
viewVariable()はControllerからset()した値を取得している。

//UsersControllerTest.php<br>
public function testSumGet()<br>
{<br>
    $this-&gt;get('Users/sum?a=0&amp;b=0');<br>
    $sum = $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(0, $sum);</p>
<p>    $this-&gt;get('Users/sum?a=10&amp;b=20');<br>
    $sum = $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(30, $sum);</p>
<p>    $this-&gt;get('Users/sum?a=1000000&amp;b=2000000');<br>
    $sum = $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(3000000, $sum);<br>
}</p>
<p>public function testSumPost()<br>
{<br>
    $this-&gt;post('Users/sum', ['a' =&gt; 0, 'b' =&gt; 0]);<br>
    $sum =  $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(0, $sum);</p>
<p>    $this-&gt;post('Users/sum', ['a' =&gt; 10, 'b' =&gt; 20]);<br>
    $sum =  $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(30, $sum);</p>
<p>    $this-&gt;post('Users/sum', ['a' =&gt; 1000000, 'b' =&gt; 2000000]);<br>
    $sum =  $this-&gt;viewVariable('sum');<br>
    $this-&gt;assertEquals(3000000, $sum);<br>
}

PHPUnitを実行すると以下のような成功メッセージが出力される。

&gt; 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()を使ったテストコードを作った。
その結果、テストコードは成功した。
しかし、カバレッジレポートが生成されるがテストが通過したことにならなかった。

コメント

タイトルとURLをコピーしました