今してるプロジェクトで、Viewクラスの構築を行っているのだけど、PHPUnitで単体テストを同時進行で作りながらコーディングしている。僕は一気に高速コーディングできるタイプのプログラマじゃないから、ユニットテストで細かくテストしながらの構築が常套手段になる。あとでデバッグするよりはシステムへの理解も高まるから良いんじゃないかと思うんだけどね。
表題の件。表示クラスの構築をしているのだけど、printやSmarty::displayなどでブラウザへの出力する内容をデバッグする方法が無いか悩んでいたのですよ。普通にPHPUnitのメソッドにありましたね。
下記、表示クラス。
<?php /*********** * 表示クラス ************/ require_once 'Smarty.class.php'; class SmartyWrapper { public smartyObj; public class __construct() { $this->smartyObj = new Smarty(); $this->smartyObj->template_dir = 'template_path'; $this->smartyObj->compile_dir = 'template_c_path'; $this->smartyObj->config_dir = 'config_path'; $this->smartyObj->cache_dir = 'cache_path'; return ; } // インスタンス取得クラス public class getSmarty() { return $this->smartyObj; } // オブジェクト変数設置クラス public class setValueSmarty($key, $value) { $this->smartyObj->assign($key, $value); return ; } // 表示クラス public class outPutSmarty($templatePath) { $this->smartyObj->display($templatePath); return ; } }
これのSmartyWrapper::outPutSmartyの出力をどうやってテストするのかを悩んだのですよ。Smartyの内部には触りたくなかったのです。
そしたらPHPUnitにはブラウザに出力する内容もチェックするメソッドがあるのですね。
class PHPUnit_Extensions_OutputTestCase extends PHPUnit_Framework_TestCase { /* 出力結果を正規表現でチェックする */ void expectOutputRegex(string $regularExpression); /* 出力結果を文字列でチェックする */ void expectOutputString(string $expectedString); bool setOutputCallback(callable $callback); }
これでテストを書くのならばこんな感じ。
<?php require_once 'smarty_wrapper.php'; class SmartyWrapperTest extends PHPUnit_Framework_TestCase { public $object; public function setUp() { $this->object =& new SmartyWrapper(); } public function tearDown() { unset($this->object); } public function test_outPutSmarty() { $this->object->outPutSmarty('template_path'); // 出力を正規表現で確認 $this->expectOutputRegex('<html.*>'); } }
以上です。
レガシーコード改善ガイド (Object Oriented SELECTION)
- 作者: マイケル・C・フェザーズ,ウルシステムズ株式会社,平澤章,越智典子,稲葉信之,田村友彦,小堀真義
- 出版社/メーカー: 翔泳社
- 発売日: 2009/07/14
- メディア: 大型本
- 購入: 45人 クリック: 673回
- この商品を含むブログ (153件) を見る