【PHP】そんなことまで出来ちゃうの!? private,protectedが見たい編
Unitテストでお決まりの「テスト対象クラスのprivate,protectedが見たい」欲。
Javaだったらリフレクション一択ですが、スクリプト言語のPHPならなにかズルがあるに違いないと思い検索。
見つけました(※2)。やっぱあるんだー。さすがー。やばいー。
#PHPでもリフレクション使っている方法もあったけれども(※1)。
■テスト対象(抜粋)
<?php class ClassLoader { protected $dirs; public function registerDir($dir) { $this->dirs[] = $dir; } }
private な変数は $array["\0クラス名\0変数名"]
protected な変数は $array["\0*\0変数名"] でアクセス可能に!
■テストコード
<?php require_once 'PHPUnit/Autoload.php'; require_once dirname(__FILE__). '/../../core/ClassLoader.php'; class ClassLoaderTest extends PHPUnit_Framework_TestCase { public function setUp() { $this->classLoader = new ClassLoader; } public function test_registerDir() { $dir ="test"; $this->classLoader->registerDir($dir); $result = (array)$this->classLoader; $this->assertEquals("test", $result["\0*\0dirs"][0]); } }
API化すればもっとシンプルにかけそう。
private も赤裸々に見えちゃうとは。すごいなー。
※1:PHPUnit + Selenium で撮れるスクリーンショットのファイル名を任意に設定する
http://gongo.hatenablog.com/entry/2012/05/29/143613
※2:PHPでprivateな変数を外部から参照するには
http://www.psi-net.co.jp/blog/?p=302