CakePHPでSimpleTest その3 モデルのテストケース作成
このエントリーでは、bakeで自動的に作成されたモデルのテストケースを改造して、次のようなことをやってみたいと思います
- 本番用のテーブルからテスト用のテーブルにデータをコピーする
- バリデーションテスト
- モデルに作ったロジックのテスト
注意点からいうと、現時点(CakePHP RC2)では、1.を行うためには、
- 自動的にテーブルを作成してくれないので、自分で作成する。
- テーブルの削除は律儀にやってくれるので、削除されないようにする(もしくは毎回テーブルを作る)。
といった対応が必要なようです
本番用のテーブルからテスト用のテーブルにデータをコピーする
テーブルの作成
今のところ、残念なことに、テーブルを自動作成することができないようです。
($importに配列を渡すと、createする前に・・・)
phpMyAdminとか好きなツールを使って、作ってください(構造だけエクスポートして、テーブル名を変更(users → test_suite_users という風に)してSQL実行がお手軽)。
データコピー
CakePHP1.2でbakeしている人のための簡単SimpleTest その1 で見たソースを変更して見ます。
テーブル名だけを指定していた部分を変更して、本番用のテーブルからデータをコピーするように指定します。
//var $table = 'users';
var $import = array('table' => 'users', 'records' => true);
またはモデル名を指定することもできます。
var $import = array('model'=>'User', 'records'=>true);
create、dropをオーバライトして、何もしない様にする
最終的なapp/test/cases/fixtures/user_fixture.phpは以下のとおり
<?php
class UserFixture extends CakeTestFixture {
var $name = 'User';
var $import = array('table' => 'users', 'records' => true);
function create(){
return false;
}
function drop(){
return false;
}
}
?>
バリデーションのテストをするのにあたって、モデルUserを以下のように変更
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'username' => array(
'rule' => 'isUnique',
'allowEmpty' => false,
'message' => 'すでに存在しているか、入力されていません。'
)
);
//モデル内の独自ロジック
function modelFunction($id){
$options = array(
'conditions' => $id,
'recursive' => -1
);
$user=$this -> find('first',$options);
return $user['User']['nickname'] .’さん’;
}
}
?>
app/test/cases/models/user.test.phpを最初の目的にあわせて、以下のように修正
<?php
App::import('Model', 'User');
class TestUser extends User {
var $cacheSources = false;
var $useDbConfig = 'test_suite';
}
class UserTestCase extends CakeTestCase {
var $User = null;
var $fixtures = array('app.user');
function start() {
parent::start();
$this->User = new TestUser();
}
function testUserInstance() {
$this->assertTrue(is_a($this->User, 'User'));
}
function testEmptyValidate() {
$data = array('username' => '');
$this->User->create($data);
$result = $this->User->validates();
$this->assertFalse($result);
}
function testUniqueValidate() {
$data = array('username' => 'cakephp');
$this->User->create($data);
$result = $this->User->validates();
$this->assertFalse($result);
}
function testModelFunction() {
$id = 1;
$result = $this->User->modelFunction($id);
$this->assertEqual($result,'Cake勉強会さん');
}
}
?>
我ながらひどい出来(モデル内ロジック)だけど、OK
関連するエントリ
CakePHPでSimpleTest その2 TestSuiteの動きをモデルのテストケースのスケルトンで確認
CakePHP1.2でbakeしている人のための簡単SimpleTest その1
参考にさせて頂いたエントリ
http://book.cakephp.org/ja/view/160/testing
http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite
http://my.opera.com/sizuhiko/blog/2008/06/28/cake-test
http://blog.takeda-soft.jp/blog/show/186
http://www.straighten.jp/p/6
http://d.hatena.ne.jp/s-yo-ko/20080328
http://www.syuhari.jp/blog/archives/429
Popularity: 72 %
by redgasuki 











コメントはまだありません。