phpunitを使ってテストをするための環境を用意する

phpunitを使ってテストをするための環境を整えました
今回はPHPフレームワークは使ってないです

composerが使える前提で、composerで入れます
その前にphpのバージョンを確認

$ php -v

PHP 5.5.31-1+deb.sury.org~trusty+1 (cli) (built: Jan  7 2016 15:26:28) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

5.5なので、対応したバージョンのphpunit 4を入れます

$ composer init

で適当に設定しておいて

$ composer require –dev “phpunit/phpunit:4.*”

これでphpunitがvendorディレクトリに用意されました

実行するには

$ vender/bin/phpunit

で動きます

実際にサンプルのテストを用意してみます
testsディレクトリにstackTestというサンプルを用意するとして

$ mkdir tests
$ vim tests/stackTest.php

<?php
class StackTest extends PHPUnit_Framework_TestCase
{
    public function testPushAndPop()
    {
        $stack = array();
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}

コードは、PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方の転載です

実行する際は、requireを自動でしてくれるautoload.phpを読み込んで実行します

$ ./vendor/bin/phpunit –bootstrap ./vendor/autoload.php tests

PHPUnit 4.8.21 by Sebastian Bergmann and contributors.

.

Time: 102 ms, Memory: 3.75Mb

OK (1 test, 5 assertions)

テストの準備が出来ました

Cakephp 2.7でFlash->errorが呼ばれたかテストを書く

Cakephp 2.7のコントローラーのテストで、Flashコンポーネントへエラーメッセージがセットされるか確認するとき

$this->controller->Flash->expects($this->once())
    ->method('error')->with($this->equalTo('error occured'));

とするとエラーになります

Expectation failed for method name is equal to <string:error> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

呼ばれてないとかって言われます
これは、FlashComponentを見ると分かりますが、errorメソッドはなく、__callを使って呼び出されているからでした

PHP: オーバーロード __call – Manual

errorメソッドは用意されてなく、用意されてないメソッドが呼ばれた時には、__callが呼ばれる仕組みを利用したものでした
いい案が思いつかなかったのですが、テストをクリアするために

$this->controller->Flash->expects($this->once())
    ->method('__call')->with($this->equalTo('error'));

としてクリアさせました
__callが呼ばれて、errorが引数に渡るので、これでグリーンになりました
メッセージがテスト出来てませんが、まずはこれでいいかと思います