Smartyのassignで代入した変数をテストするときに楽する方法。
基本的にSmarty::assignした変数をテストするには下記の感じ。他でテンプレートファイルを用意して、Smarty::fetchで出力した内容をassertEqualsで比較するというのが常道。
{* foo.tpl *}
<html>
<head></head>
<body>{$hi}</body>
</html>
<!-- foo.html -->
<html>
<head></head>
<body>Hello World!</body>
</html>
<?php
class FooTemplateTestCase extends TestCase {
protected $_view;
public function setup(){
$this->_view = new Smarty();
// setup smarty options, caching, etc
}
public function test(){
$this->_view->assign('hi', 'Hello World!');
$output = $this->_view->fetch('foo.tpl');
$expected_output = file_get_contents('foo.html');
$this->assertEquals($expected_output, $output);
}
}
他ファイルにテンプレートファイルを用意するのがいかにもダルい。一つのファイルの中で完結させる方法を探して、見つけたのが下記。
<?php
class FooTemplateTestCase extends TestCase {
protected $_view;
public function setup(){
$this->_view = new Smarty();
// setup smarty options, caching, etc
}
public function test(){
$this->_view->assign('hi', 'Hello World!');
$var_arr = array('test1', 'test2', 'test3');
$this->_view->assign('arr', $var_arr);
$this->assertEquals('Hello World!', $this->_view->fetch('eval:{$hi}'));
$this->assertEquals('test1test2test3', $this->_view->fetch('eval:{foreach from=$var_arr item=loop}{$loop}{/foreach}));
}
}
以後、余談。
業務でパッケージソフトのCMSを使って求人サイトなどを作っているのですが、邪悪なコードの組み方されていてイライラする。GLOBAL変数が各所に散りばめられていて何故か動くメソッドがある。逆にカスタマイズすると依存関係で動かないメソッドもある。巨大な万能クラスがあってDBやらテンプレート処理をまとめてそこで処理をする。これを見てつくづくなんでもできるクラスは作っちゃ駄目だと実感。つーか実質ベタ書きじゃん、これ。DBをラップクラスで処理するのは正しいと思うが、呼び出すメソッドがあまりにも可読性が悪すぎて、僕はSQLを直接出力させてクエリ実行したくてならない。DBもリレーションの仕方がむちゃくちゃで、後々訪れるアクセス負荷対策を想像すると目眩がする。
他の人が作ったソースを読むと自分で書き直したくなる病は、若さゆえの過ちだと思っていた。しかし、今は本当に自分で書き直したくてならない(実際、外部にクラスを作って作りなおすという正直しんどい作業をしている。納期的に新規でスクラッチは無理!)。オブジェクト指向は疎結合が大事だというのは散々に学んできた。この密結合のCMSから機能毎にクラスを引っぺがす作業に目眩がする思いです……。