テスト結果にexceptionsの詳細を表示する
Ethnaでユニットテストをやってると、Resultのexceptionsがいくつかカウントされてるときがあります。でもいちおう全部passしてるし・・・。
テストコードをとっかえひっかえして試してみたところ、どうやら文法エラーがあるとexceptionとしてカウントされるみたい?
Ethna_UnitTestReporterを下のように拡張するとexceptionの詳細を表示するようになった。
app/appid_UnitTestReporter.php
<?php class appid_UnitTestReporter extends Ethna_UnitTestReporter { /** * エラー * * @access public * @param string $message メッセージ */ function paintError($message) { parent::paintError($message); $breadcrumb = $this->getTestList(); $test = $breadcrumb[2]; array_shift($breadcrumb); $this->report[] = array( 'type' => 'Error', 'test' => $test, 'breadcrumb' => $breadcrumb, 'message' => $message, ); } }
あとはこのUnitTestReporterを使うようにControllerとUnitTestManagerに手を加える。
app/appid_Controller.php
クラス定義を追加。
<?php class appid_Controller extends Ethna_Controller { /** * @var array クラス定義 */ var $class = array( /* * TODO: 設定クラス、ログクラス、SQLクラスをオーバーライド * した場合は下記のクラス名を忘れずに変更してください */ 'unittest_reporter' => 'appid_UnitTestReporter', // 追加 ); }
app/appid_UnitTestManager.php
UnitTestReporterのインスタンス取得部分を変更したいためだけにrun()をまるごとコピー。
<?php class appid_UnitTestManager extends Ethna_UnitTestManager { /** * ユニットテストを実行する * * @access private * @return mixed 0:正常終了 Ethna_Error:エラー */ function run() { $action_class_list = $this->_getTestAction(); $view_class_list = $this->_getTestView(); $test =& new GroupTest("Ethna UnitTest"); // アクション foreach ($action_class_list as $action_name) { $action_class = $this->ctl->getDefaultActionClass($action_name, false).'_TestCase'; $action_form = $this->ctl->getDefaultFormClass($action_name, false).'_TestCase'; $test->addTestCase(new $action_class($this->ctl)); $test->addTestCase(new $action_form($this->ctl)); } // ビュー foreach ($view_class_list as $view_name) { $view_class = $this->ctl->getDefaultViewClass($view_name, false).'_TestCase'; $test->addTestCase(new $view_class($this->ctl)); } // 一般 foreach ($this->testcase as $class_name => $file_name) { $dir = $this->ctl->getBasedir().'/'; include_once $dir . $file_name; $testcase_name = $class_name.'_TestCase'; $test->addTestCase(new $testcase_name($this->ctl)); } // ActionFormのバックアップ $af =& $this->ctl->getActionForm(); //出力したい形式にあわせて切り替える $reporter =& $this->backend->getObject('unittest_reporter'); $test->run($reporter); // ActionFormのリストア $this->ctl->action_form =& $af; $this->backend->action_form =& $af; $this->backend->af =& $af; return array($reporter->report, $reporter->result); } }
これで文法エラーがあればNOTICEとかWARNINGとかのメッセージが各テスト結果の下に追加されます。ひとあんしん。