• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

symfonyバリデーション

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

symfony 単体(ユニット)・機能テストするへ戻る

symfonyバリデーション

テスト方法を把握したら、
今度は実際にテストを行う。
テストはすべてOKになるまで行うのが原則。
バリデータ、ロジックなどの調整とテストを繰り返す。

symfonyにはバリデーション機能は標準装備されているので、
それを利用する。

symfonyまずはテストケース作成

バリデーションはテストを詰めていった結果に過ぎない。
なのでここではひたすらテストをしていく。

まず、入力フォームの仕様を整理しようしてみる。

項目フォーム名属性詳細
名前nameinput text必須入力
メールアドレスmailinput text必須入力、メールアドレス形式。
問い合わせ内容inquirytextarea必須入力
確認 - input submit -

この通りテストケースを作成する。
パターンが多いわりに単調なため、
テストケースジェネレータを利用している。
良かったら使って欲しい。
Symfony Testcase Generator - Lightning Tools

チェックしたいページのURLを入力して[Get Elements]ボタンをクリックすると
フォームを解析したページが表示される。
さらに[Generate]ボタンをクリックするとテストケースが表示されるという流れ。
(ただし、まだ全機能は実装完了していない。LOL

ジェネレーターを元に作成したのが以下のテストケース。
test/functional/myapp/inquiryActionsTest.php

<?php
 
include(dirname(__FILE__).'/../../bootstrap/functional.php');
 
// create a new test browser
$browser = new sfTestBrowser();
 
// request test
echo "request test";
$browser->initialize();
$browser->get("/inquiry/index")
  ->isStatusCode(200)
  ->isRequestParameter('module', 'inquiry')
  ->isRequestParameter('action', 'index')
  ->checkResponseElement('body', '!/This is a temporary page/');;
 
// if you want to look current html
//echo $browser->getResponseDom()->saveXML();
 
// all null
echo "all null";
$browser->initialize();
$browser->get("/inquiry/index");
$browser
  ->setField("act", null)
  ->setField("name", null)
  ->setField("mail", null)
  ->setField("inquiry", null)
;
$browser->click("確認")->isForwardedTo("inquiry", "index");
 
 
// null
// name is null
$browser->initialize();
$browser->get("/inquiry/index");
$browser  ->setField("act", 'index' )
  ->setField("name", null)
  ->setField("mail", "dozo@matrix.jp" )
  ->setField("inquiry", '7e29b5' )
;
$browser->click("確認")->isForwardedTo("inquiry", "index");
// mail is null
$browser->initialize();
$browser->get("/inquiry/index");
$browser  ->setField("act", 'index' )
  ->setField("name", 'd5ccc1' )
  ->setField("mail", null)
  ->setField("inquiry", '7e29b5' )
;
$browser->click("確認")->isForwardedTo("inquiry", "index");
// inquiry is null
$browser->initialize();
$browser->get("/inquiry/index");
$browser  ->setField("act", 'index' )
  ->setField("name", 'd5ccc1' )
  ->setField("mail", "dozo@matrix.jp" )
  ->setField("inquiry", null)
;
$browser->click("確認")->isForwardedTo("inquiry", "index");
 
// email not valid 
$browser->initialize();
$browser->get("/inquiry/index");
$browser  ->setField("act", 'index' )
  ->setField("name", 'd5ccc1' )
  ->setField("mail", "38111a")
  ->setField("inquiry", '7e29b5' )
;
$browser->click("確認")->isForwardedTo("inquiry", "index");
 
// success
$browser->initialize();
$browser->get("/inquiry/index");
$browser  ->setField("act", 'index' )
  ->setField("name", 'd5ccc1' )
  ->setField("mail", "dozo@matrix.jp")
  ->setField("inquiry", '7e29b5' )
;
$browser
    ->click("確認")
    ->isRedirected()
    ->followRedirect()
    ->isRequestParameter('module', 'inquiry')
    ->isRequestParameter('action', 'end')
;

symfony テスト開始

このテストケースでテストしてみる。

$ symfony test-functional myapp mymoduleActions

テスト結果

not ok 2に着目。
こちらの要求としては、
メールアドレスでなかった場合はindexアクションに遷移して欲しいところなのだが、
実際はdoアクションに遷移してしまっている。

symfony バリデータ調整

先ほどのテストでメールアドレスのチェックが甘いことがわかっている。
そこでバリデータにメールアドレスのチェック項目を追加する。

methods:         [post]     # This is the default setting

fields:
  name:
    required:
      msg:       名前が入力されていません。

  mail:
    required:
      msg:       メールアドレスが入力されていません
    sfEmailValidator:
      email_error:  メールアドレスが正しくありません。

  inquiry:
    required:
      msg:       問い合わせ内容が入力されていません

symfony 再テスト

  $ symfony test-functional myapp mymoduleActions

今度はすべてOKとなっていることがわかる。
機能を追加する時は、
ビューの項目を追加した後、
テストをしつつバリデータを調整するのが良い。

ただし、実際のテストとしては上記の項目では十分とは言えない。
今回その部分には触れないが
頭の片隅にでも置いておくように。

symfony確認画面を作るへ続く


framework/symfony/validation.txt · 最終更新: 2007/06/17 15:05 by dozo