データベースの設定が混在している環境のテストケース
デフォルトのデータベースとして「MySQLのデータベースその1」を利用して、「MySQLのデータベースその2」や「Oracleのデータベース」なども混在して利用するという開発環境での話し。
この環境でデフォルトではない「Oracleのデータベース」を利用するモデルのテストケースを作っていて、うまいことfixtureからテスト用のテーブルができてくれないので悩んだ。
ちゃんと確認していないけど、デフォルトのデータベース接続「default」設定をもとにテスト用のデータベース接続「test_suite」を作成するから、デフォルトの「MySQLのデータベースその1」の接続が「Oracleのデータベース」のfixtureやテストケースにも利用されているっぽい?
fixtureやテストケースの設定次第でどうにかなりそうだったけど、しばらくソースコードをながめて上手な解決策が思い浮かばなかったので、強引にテストケースで処理を上書きすることで解決しちゃいました。
こんな感じで、それなりにテストケースが動いたので、たぶん問題ないのかな、と……。
class FooTestCase extends CakeTestCase { public $fixtures = array('app.oracle_hoge'); public function start() { $this->db = ConnectionManager::getDataSource('oracle'); $this->db->config['prefix'] = 'test_suite_'; $this->_fixtures['app.hoge']->table = 'hoge'; $Hoge = ClassRegistry::init('hoge'); /* TestSuite */ { $Hoge->tablePrefix = 'test_suite_'; } parent::start(); }
fixtureのtableプロパティを書き換えているのは、テスト対象のテーブルが複合主キーだから、モデルのuseTableプロパティをfalseにしてゴニョゴニョ……管理上の問題でモデル名が規約違反だったり……なモデルだからなので、たぶん本来であれば必要ないのでは?