Displaying posts written in

9月 2010

CakeTestCaseを独自の拡張クラスに置き換える

環境: CakePHP 1.3

CakePHPでTestCaseの機能を拡張したい場合、CakeTestCase クラスを継承した独自のベースクラスを作る。

abstract class MyTestCase extends CakeTestCase {
  function assertHoge() {
    //...
  }
}

しかし標準ではこのクラスを自動的に読み込む手段がない。各テストファイルの先頭で毎回 App::import するのはあまりにも面倒なので、自動で読み込むための方法を調べてみた。

前提:

  • 必要なファイルは全て一つのプラグイン(以下 my_test)の中にまとめる
  • Webからの実行(test.php)、コンソールからの実行(cakeshell)、両方に対応する

my_test/config/bootstrap.php

この bootstrap.php の中で MyTestCase はじめとする必要なクラスファイルを読み込む。下の例では ComponentTestCase も読み込んでいる。

my_test/libs/test_suite_dispatcher.php

test.phpからの実行時に必要なファイル

my_test/vendors/shells/my_test.php

コンソールからの実行に必要なファイル

以上の3ファイルが app/plugins/my_test 以下にあれば良い。

コンソールから実行する場合

cake testsuite の代わりに cake my_test を実行するだけ。

Webからtest.phpで実行する場合

test.php の書き換えが必要。といってもファイル末尾の CakeTestSuiteDispatcher を MyTestSuiteDispatcher に入れ替えるだけ。

require_once CAKE_TESTS_LIB . 'cake_test_suite_dispatcher.php';
//
App::import('lib', 'MyTest.MyTestSuiteDispatcher');
$Dispatcher = new MyTestSuiteDispatcher();
//
$Dispatcher->dispatch();

参考: CakePHP1.3 CakeTestCase の拡張を読み込む bootstrap 的なものをつくる

CakePHPのデータベース情報を使ってmysqlコマンドで接続する

環境: CakePHP 1.3

CakePHPでの開発中、コマンドラインから直接SQLを実行したいことがままあるので、CakePHPのdatabase.phpから情報を取得してmysqlコマンドで接続するためのシェルスクリプトを作った(要CLI版php)。

connect_db.sh

何もオプションを指定しなければそのままmysqlのインタラクティブシェルに入る。

./connect_db.sh

コマンドライン引数はそのままmysqlコマンドに渡されるので、例えば -e オプションを使うとそのままSQLを実行できる。

./connect_db.sh -e 'select * from users'

標準では default 接続が使われる。その他の接続設定を使いたい場合は connect_db.sh に対して connect_db_{接続名} という名前でシンボリックリンクを作る。

# DATABASE_CONFIG->test に接続
ln -s connect_db.sh connect_db_test
./connect_db_test

私の場合 app と同じ階層に bin というディレクトリを作ってそこにシェルスクリプトを置いているので、パスもそれに合わせてある。異なるディレクトリ構成で使う場合は最初のAPPの定義を適宜書き換える。