テスト環境は別のDBを使う、という設定

テスト実行時はそれまで作ってたデータが消えてしまったりするのが嫌ですよね。

App::import('Model', 'User');
class UserTest extends User {
  $this->useDbConfig = 'test';
}  

とか定義して、このUserTestクラスをつかってUnitテストを書いたりしてみたんですが、
Userクラス内のhasManyとかbelongsToなどの関連データがtestじゃなくてdefaultの環境から
selectされちゃって行き詰まってしまいました。。。

runkitというやつで動的に定義をオーバーライドすることも考えましたが、
そこまですることでもないな、ということで対応は以下になりました。

app/webroot/test.php の 98行目付近

require_once CAKE_TESTS_LIB . 'test_manager.php';

の後ろ辺りに

Configure::write('CAKE_ENV', 'test');

と定義。

加えて app/app_models.php に下記のコンストラクタ定義を追加。

function __construct($id = false, $table = null, $ds = null) {
  if(Configure::read('CAKE_ENV')) $this->useDbConfig = Configure::read('CAKE_ENV');
  parent::__construct($id, $table, $ds);
}

Railsに比べ、サーバの構成とか、フォルダの構成とかが柔軟に変えられるのがCakePHPのいいところですね。

参考にした記事:
CakePHP 環境に応じてDBの設定を変える http://www.1x1.jp/blog/2006/09/cakephp_db_config.html
テスト環境でのDBの切り替え方 http://cakephp.blog16.jp/index.php/2008/07/02/p28