PHPUnitで表示する内容をテストする。
今してるプロジェクトで、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.*>');
}
}
以上です。