CakePHPのModelとControllerのテストでValidationエラーをチェックする
Model
CakePHPでValidationエラーを確認するTestコードです。
Postモデルに$validateを定義します。
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エラーが発生するようにしています。
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を作成します。
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メソッドを送信します。
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プロパティ
へのアクセス方法が異なるので注意が必要です。