環境: 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();
[...] それならいっそ全テーブルを自動で読み込んでくれよ、ということで自動で読み込む方法を考えました。以下のクラスに示す2メソッドを CakeTestCase のサブクラスで定義してください(CakeTestCaseを独自の拡張クラスに置き換えるも参照)。 [...]