はじめに
こんばんは。
ちょっとしたハマりがありましたので、備忘録で残しておきます。
本題
cakephpでは config/bootstrap.php がかなり最初の方に呼ばれます。
それはテストでも実コードでも一緒です。
そのbootstrap上で、 $users = TableRegistry::getTableLocator()->get('Users'); みたいな感じで、テーブルをロードして、それを使おうとしている場合、コントローラのテストが落ち始めます。
例えば以下のような感じで、
<?php
$aUsers = TableRegistry::getTableLocator()->get('AUsers');
$bUsers = TableRegistry::getTableLocator()->get('BUsers');
$cUsers = TableRegistry::getTableLocator()->get('CUsers');
return [
'Repository' => [
'A' => new AUserRepository($aUsers),
'B' => new BUserRepository($bUsers),
'C' => new CUserRepository($cUsers),
]
];
みたいなかんじでコントローラ側でそれを使う場合に発生します。
原因
基本DBのコネクションは defaultを使うと思います。 そして、テスト時のコネクションは testを使うと思います。
cakephpのテストでは、phpunitが実行する startTest() でfixtureを読み込んでいます。 その際に、実装コードからDBに接続する場合で、テストコードからの実行の場合のみ、defaultのconnection設定をtestのものに変更するような処理が存在します。
この _aliasConnections() が実行されるより、bootstrap.phpの実行のほうがはやいので、上記のような設定を bootstrapに書くと、そこで書いている、 AUsers, BUsers ,CUsers は testコネクションに切り替える前にdefaultコネクションでインスタンス化されてしまいます。
このせいで、特定のテーブルのみ defaultコネクションをみていて、DBの取得うまくできず落ちちゃうという感じになりました。
終わりに
なかなかやらないことですが、ガッツリハマって、調べたので残しときます。
あんまり特殊なことしないほうが良いですね。
現場からは以上です。