cakephpでcontrollerのテストを極める

2014年12月21日更新 view: 287 view
photoBy: http://www.shellbarbakery.com/wp-content/uploads/…

cakephpのコントローラーをテスト

まずはphpunitが使えることになっていることが前提。

テストコード

/app/Test/Case/Controller/HogesControllerTest.php

<?php
    class HogesControllerTest extends ControllerTestCase {

        public function testインデックスが表示されるかテスト()
        {
            $this->testAction('/hoges/index/', array('return' => 'view'));
//            ビューが入る
            pr($this->view);
        }

        public function testインデックスの変数だけ取得()
        {
            $this->testAction('/hoges/index/', array('return' => 'vars' ));

//            $this->set されたものだけ取得
//            pr($this->vars);
        }

        public function testセッションをテスト()
        {
            $this->testAction('/hoges/session/', array('return' => 'vars' ));

            $result = $this->controller->Cookie->read('Test.Budou');
//            pr($result);
            
            $session = CakeSession::read();
//            pr($session['Test']['Mikan']);
        }

        public function testデータ登録()
        {
            $this->testAction('/hoges/add/', array('return' => 'view', 'method' => 'post', 'data' => array(
                "name" => "太郎",
                "count" => 3
            )));

//            リダイレクトされるのでviewは取得できない
//            pr($this->view);

//            Flashメッセージを取得
            $flash = CakeSession::read('Message.flash');
//            データがポストされました
            $this->assertTextContains('データがポストされました', $flash['message']);
//         http://mntra.net/hoges/results/
            $this->assertRegExp("/results/", $this->headers["Location"]);
        }

        public function testAssertの種類()
        {
            //文字列チェック
            $this->assertEquals("AとBが同じ","AとBが同じ");
            $this->assertNotEquals("AとBが同じでない","AとBが違う");

            //正規表現
            $this->assertRegExp("/正規表現/","Majiで正規表現koiする5秒前");

            //数値チェック
            $this->assertLessThan(50, 3);//3が50より小さい
            $this->assertGreaterThan(3, 50);//50が3より大きい

            //true or false
            $this->assertTrue(true);
            $this->assertFalse(false);

            //配列チェック
            $this->assertArrayHasKey("natu", array("huyu" => "xmas" , "natu" => "obon"));//キー natuがある
            $this->assertContains("xmas", array("huyu" => "xmas" , "natu" => "obon"));//値 xmasがある



            //nullチェック
            $this->assertNull(null);
            $this->assertNotNull("ありますがね");



        }
        
        
    }
?>

コード

/app/Controller/HogesController.php

<?php

App::uses('AppController', 'Controller');
App::uses('ComponentCollection', 'Controller');

class HogesController extends AppController {

    public $components = array(
        'Cookie',
        'Session'
    );

    public function index()
    {
        $gohan = "shiroi";
        $ringo = "akai";

        $this->set(
            compact(
                'gohan'
            )
        );

    }

    public function session()
    {
        $this->Cookie->write("Test.Budou", "murasaki", false, '+4 weeks');
        $this->Session->write("Test.Mikan","orange");
        $this->autoRender = false;
    }

    public function add()
    {
        if ($this->request->is('post')) {
            $this->Session->setFlash('データがポストされました');
            $this->redirect('/hoges/results/');
        }
    }

    public function results()
    {
        
    }



}

ビュー

スポンサードリンク

中身はなんでもいいので、
hoges/
index.ctp
add.ctp
results.ctp の

3つを作成。

準備完了。これで your.com/test.php で hoges の controllerのテストをすればオールグリーンになる。

解説

インデックスが表示されるかテスト

$this->testAction('/hoges/index/', array('return' => 'view'));
で、hogesのindexメソッドが読まれ、$this->viewに view の内容が格納される。

インデックスの変数だけ取得

$this->testAction('/hoges/index/', array('return' => 'vars' ));
とやることで、 コントローラーで $this->set された変数のみ取得。

セッション、クッキーをテスト

$result = $this->controller->Cookie->read('Test.Budou');
でクッキーを取得。

$session = CakeSession::read();
でセッションを取得。

データ登録

データ登録された先はリダイレクトがあるのでデータは取得できない。
その代わり、
CakeSession::read('Message.flash'); で setflash されたメッセージを、
$this->assertRegExp("/results/", $this->headers["Location"]); でリダイレクト先を取得できる。

Asseert

上記で取得した変数やデータを Assert を使って検証していく。

assert jsonかどうか?

$this->assertJson($json);
スポンサードリンク

関連記事

関連カテゴリ

コロ助

web関連の記事や制作系の記事をどんどんまとめていきます。 宜しくお願いします!

ピックアップ

パソコン・ソフトウェア ランキング

8月20日 ( 日 ) にアクセスが多かった記事はこちら!