忍者ブログ

きままなひとりごと

引っ越しました。新しいブログはnmtysh.logです。
2015/12/27

ブログを引っ越しました

ブログの引っ越しを行いました。
別サービスへの移行になるため過去記事をすべて再確認しつつ、記事の削除やリンクの差し替えなどを行っています。
現在では役に立たなくなっているtipsなどは削除していますのでご了承ください。

新しいブログはこちらです。
nmtysh.log

今後は新しいブログのほうで更新していきますのでそちらをご覧ください。
2017/03/27 (Mon) 13:42

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2013/11/27 (Wed) 00:50

[PHP] CakePHP の $useDbConfig にはまった(備忘録)

結論: FixtureのuseDbConfigでDataSourceを指定するには、対になるDataSourceが定義されてないと駄目でした。
例) $test_hoge = array(/* ... */); なら $hoge = array(/* ... */); が定義されてないと駄目。


動的にDBの接続先を切り替えるプログラムを書いていて、Unitテストも別々のテスト用のDBにアクセスさせようとしていたのですが、かなり嵌ってしまいました。
$useDbConfig プロパティを指定することで、テストモデルの データベースをオーバーライドできます。テーブルが正しいデータベースで 生成されるように、関連するフィクスチャが同じ値を使うことを確認してください。
テスト - CakePHP Cookbook v2.x documentation
とあったので、Fixtureでテスト用に用意した別のDBに接続させたいため、FixtureにuseDbConfigで設定してました。

例えば、
public $default = array(/* ... */);

// 動的にプログラムの中で接続先DB名を変更
public $hogehoge = array(/* ... */);

// 上の開発用デフォルトDB
public $default_hoge = array(/* ... */);

// $default のテスト用DB
public $test = array(/* ... */);

// 開発用DBのテスト用DB
public $test_hoge = array(/* ... */);
なDataSourceがあって、Modelには
class TableA extends AppModel {

    public $useDbConfig = "default";
}

class TableB extends AppModel {

    public $useDbConfig = "hogehoge";

    function __construct($id = false, $table = null, $ds = null ) {
        parent::__construct($id, $table, $ds);
        $db = ConnectionManager::getDataSource("hogehoge");
        $db->config['database'] = 'fuga';
        $db->reconnect();
    }
}
Fixtureには
class TableAFixture extends CakeTestFixture {

    public $useDbConfig = "test";
}

class TableBFixture extends CakeTestFixture {

    public $useDbConfig = "test_hoge";
}
と書きました。
ですが、いざテストを実行してみるとTableBを利用するテストもDataSourceは"test"を向いてしまい、
Table table_b for model TableB was not found in datasource test.
とエラーになってしまったのです。
debugレベル2で出るクエリログではtest_hogeにデータを入れてテーブルを作成しているのですが、肝心のテスト内でtest_hogeを向いてくれませんでした。

色々探しているとリファレンスに気になる記述がありました。
$useDbConfig プロパティはフィクスチャが使うデータソースの定義をします。 複数のデータソースを使うときは、モデルのデータソースと合わせてフィクスチャを 作るようにします。ただし、 test_ というプレフィックスをつけてください。 たとえば、 mydb というデータソースを使うモデルの場合は、フィクスチャの データソースを test_mydb とします。もし test_mydb の接続が 存在しなかったときは規定値として mydb がデータソースとして使われます。 テストを実行するときにテーブル名の衝突を避けるため、フィクスチャのデータソースには test の接頭辞が必ず付きます。
テスト - CakePHP Cookbook v2.x documentation
そこで試しに"default_hoge"を"hoge"に変えてみると、TableBのFixtureでちゃんと"test_hoge"を使ってくれるようになりました。
public $default = array(/* ... */);

// 動的にプログラムの中で接続先DB名を変更
public $hogehoge = array(/* ... */);

// 上の開発用デフォルトDB
public $hoge = array(/* ... */);

// $default のテスト用DB
public $test = array(/* ... */);

// 開発用DBのテスト用DB
public $test_hoge = array(/* ... */);
class TableAFixture extends CakeTestFixture {

    public $useDbConfig = "test";
}

class TableBFixture extends CakeTestFixture {

    public $useDbConfig = "test_hoge";
}
どうやら対になるDataSourceが無いと駄目なようです。
test_から始まるDataSource名で有ればよいのだと勘違いをしていました。

とほほ。自分の勘違いとはいえ解決にかなり時間を使ってしまいました。


参考:
テスト - CakePHP Cookbook v2.x documentation

拍手[0回]

PR