質問: お世話になっております。 cakephpの公式ドキュメントにおいて > > テストのためにモデルをセットアップするときは、テスト用のデータベース接続を 使うようにするために必ず ClassRegistry::init('YourModelName'); を使ってください。 > > > という一文がありますが、この意味がよくわかりません。 App::usesで読み込んだモデルを直接$testで設定したデータベース設定が無効になる要因ってあるのでしょうか。そもそも$developmentのDB設定がtest実行時に$testに切り替わる処理はどこで定義されているのでしょうか。 cakeのphpunitを触るのも初めてで動作機序もよくわかっていないのでその辺りがわかりやすく説明されている情報はどこかにないでしょうか。有料の書籍などでも構わないのでオススメの本などがあれば,教えていただきたいです。 よろしくお願い致します。
回答: > > そもそも$developmentのDB設定がtest実行時に$testに切り替わる処理はどこで定義されているのでしょうか。 > > > ClassRegistryのソースコードは、以下に格納されているので、中を見てもらえればわかると思います /(プロジェクトルート)/lib/Cake/Utility/ClassRegistry.php 146行目付近から以下のように生成したModelオブジェクトに、TEST用の環境を設定しています。 ``` if (class_exists($class) || interface_exists($class)) { $reflection = new ReflectionClass($class); if ($reflection->isAbstract() || $reflection->isInterface()) { throw new CakeException(__d('cake_dev', 'Cannot create instance of %s, as it is abstract or is an interface', $class)); } $testing = isset($settings['testing']) ? $settings['testing'] : false; if ($testing) { $settings['ds'] = 'test'; $defaultProperties = $reflection->getDefaultProperties(); if (isset($defaultProperties['useDbConfig'])) { $useDbConfig = $defaultProperties['useDbConfig']; if ($availableDs === null) { $availableDs = array_keys(ConnectionManager::enumConnectionObjects()); } if (in_array('test_' . $useDbConfig, $availableDs)) { $useDbConfig = 'test_' . $useDbConfig; } if (strpos($useDbConfig, 'test') === 0) { $settings['ds'] = $useDbConfig; } } } ・・・ ``` 自分がPHPが良いなと思うところの一つに、スクリプト言語のためライブラリ側の処理の内容をすぐ確認できることがあります。 ですので、気になる部分はライブラリ側のコードを確認してはいかがでしょうか?