CakePHPのModelとControllerのテストでValidationエラーをチェックする
Model
CakePHPでValidationエラーを確認するTestコードです。
Postモデルに$validateを定義します。
1 2 3 4 5 6 7 8 9 10 11 | App::uses( 'AppModel' , 'Model' ); class Post extends AppModel { public $validate = array ( 'title' => array ( 'rule' => 'notEmpty' , 'message' => 'title is required' , 'required' => true ), ); } |
このModelを対象に
- PostsControllerTest
- PostTest
を作成し、Validationエラーのチェックを行います。
Modelのテストコード
setUp()でPostモデルを利用可能な状態にした上で、test_addNoData()でModelのsaveメソッドを実行可能にしています。saveメソッドに渡す引数にはテスト用のダミーデータを渡して、Validationエラーが発生するようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | App::uses( 'Post' , 'Model' ); class PostTest extends CakeTestCase { public $fixtures = array ( 'app.post' ); public function setUp() { parent::setUp(); $this ->Post = ClassRegistry::init( 'Post' ); } public function tearDown() { unset( $this ->Post); parent::tearDown(); } public function test_addNoData() { $data = array ( 'id' => 4, 'title' => '' ); $this ->Post->save( $data ); $this ->assertNotEmpty( $this ->Post->validationErrors); } } |
Controllerのテストコード
Controllerの作成
Validationエラーのチェックは、Model側のテストコードだけでなく、Controller側でテストすることも出来ます。最初にテスト対象となるControllerを作成します。
1 2 3 4 5 6 7 8 | public function add() { if ( $this ->request->is( 'post' )) { $this ->Post->create(); if ( $this ->Post->save( $this ->request->data)) { return $this ->redirect( '/posts/index' ); } } } |
PostsController内にaddアクションを追加しました。save()のタイミングでValidationチェックが発生しますので、ダミーの空データを渡して、Validationエラーをチェックします。
Validationエラーのチェック
Controller側のテストコードでは、$this->testAction()を使ってPOSTメソッドを送信します。
1 2 3 4 5 6 7 8 9 10 11 12 | public function testAddNoData() { $result = $this ->testAction( '/posts/add' , array ( 'data' => array ( 'Post' => array ( 'id' => '4' , 'title' => '' ) ), 'method' => 'post' , ) ); debug( $this ->controller->Post->validationErrors); $this ->assertNotEmpty( $this ->controller->Post->validationErrors); } |
Modelのテストコードとは、
validationErrorsプロパティ
へのアクセス方法が異なるので注意が必要です。