CakePHP2のテストで、$defaultのDBを見に行ってしまう件、解決。

CakePHP2のテストで、$defaultのDBを見に行ってしまう。と書きましたが、解決しました。

/App/Model/AppModel.php で__construct()を定義したとき、正しく引数を受け取って親クラスに渡してあげないといけなかったようです。

public function __construct($id = false, $table = null, $ds = null) {
    parent:__construct($id, $table, $ds);
    // 何かの処理
   }

のように引数を明示的に書いてあげます。

テストケースのsetup()にあるモデルを設定しているClassRegistry::init()が中で$useDbConfigをtestでモデルオブジェクトをインスタンスにしているところがあって、そのときのパラメータがクラスに引き渡されていないのが原因でした。

CakePHP2のテストで、$defaultのDBを見に行ってしまう。

CakePHP2でテストするときに、/app/Config/database.phpの$testではなくて$defaultで指定したDBを見に行ってしまいます。こちらの対処方法のメモ。

テーブルにtext型の項目があると、memoryではなくてMyISAMでテストのテーブルを自動的に作りに行きます。この辺りが関係しているかもしれません。こちらはbakeすると、Fixtureの$fieldsの中にtableParametersに設定されています。

テストの途中でexit()して上げると、$testのほうのDBにテストのためのテーブルをFixtureからcreate tableしてくれていることを確認できます。しかし、テストケースでは、$defaultのほうのDBを見に行きます。

CakePHP2のCookbookに書いているように、Fixtureに

public $useDbConfig = 'test';

と書いてもダメでした。

public $import = array('table' => 'articles', 'connection' => 'test');

のようにしてもダメ。

結局は、

class ArticleTestCase extends CakeTestCase {
    public $fixtures = array('app.Article');
    public function setUp() {
        parent::setUp();
        $this->Article = ClassRegistry::init('Article');
        $this->Article->useDbConfig = 'test';
    }

のように無理矢理モデルの$userDbConfigにtestをして対応しました。

もっと良い方法があるのでしょうね。これだと、joinされたFixtureのテーブルデータだと見つからないのてテストできないとか問題が残ります。

マニュアルに書いていないことは何とか対応しなければいけないのは大変です。

XAMPPのバーチャルホストを設定してCakePHPのテストサイトを構築する。

CakePHPで開発していて、ローカルのサーバーにテストサイトで動かしたいとき、まともにlocalhost直下に置ければいいのですが、いろいろとプロジェクトを抱えていると、たくさんのテストサイトを同時に動かしたいときがあります。サブディレクトリごとに設定してあげてもいいのですが、これだと.htaccessの設定が面倒であったり、絶対アドレスでリンクを指定できないとか制限があります。

ドメイン直下にドキュメントルートを配置できればいいのですが、一つ考えられるのはサブドメインを指定するというのがあります。しかし、これではlocalhostでは指定できないととか、わざわざローカルのPCにサブドメインを指定するのもやっかいであるとなります。

次に考えられるのはポート番号で分けてしまう方法があります。例えば

  • Aプロジェクトは、http://localhost:8080/
  • Bプロジェクトは、http://localhost:8082/

などでアクセスすることになります。これですと、ポート番号を適当に追加していけばプロジェクトを分けてアクセスすることが可能にになります。

簡単にローカルのPCにCakePHPのテスト環境を構築するにはXAMPPをインストールしてしまうのが一番簡単です、XAMPPを一つインストールしてしまえば、CakePHPのテスト環境で必要なApacheや、PHP、MySQLも動かすことがことができます。

ポート番号で分けてCakePHPの環境で動かすには、Apacheのhttpd.confにバーチャルホストの設定を追加してしまいます(ここからが本題)。上記のAプロジェクトの場合はApacheのhttpd.confに以下のバーチャルホストの設定を追加します。

Listen <span style="color: #ff0000;">8080</span>

8080>

DocumentRoot "<span style="color: #ff0000;">C:/workspace/TestProject/app/webroot</span>"
DirectoryIndex index.html index.php
ServerName localhost

<Directory "<span style="color: #ff0000;">C:/workspace/TestProject/app/webroot</span>">
Options Indexes FollowSymLinks MultiViews Includes ExecCGI
AllowOverride All
Order deny,allow
Allow from all

この場合、ダウンロードしたCakePHPは、c:\workspace\TestProjectにコピーしてしますと(EclipseのPDTで開発しているためこんなディレクトリにプロジェクトを入れています)、ドキュメントルートはその下の\app\webrootになります。プロジェクトを増やす場合は、赤字の部分を変更すればいいでしょう。

Optionsは、適当に動作させる環境に合わせて設定してください。これは、テスト環境を自分のローカルPC以外からアクセスできないようにしたり、ましてインターネットからアクセスできないようにしたり(もちろん当たり前ですが)してしまえば、あまり気にしなくてもよいかもしれません。

以上、いつもhttpd.confの設定でつまずく覚え書きです。

追記

せっかくこの記事にたどり着いて読んでくれたところ申し訳ありませんが、現在(2014/04/28)のところ、この方法は使っていません。今はVirtual Box+Vagrant+Chefでローカルのテストサイトを構築しています。