limeにプラグイン機構を乗っけてみた
symfonyのテストフレームワークlimeはPHP版のTest::Moreとして単体で使うにも具合がいいけど、Test::More単体の機能しか備えてないので、拡張モジュールでサポートされているようなテストが出来ない。
例えば、例外のテストなんかはTest::Exceptionが提供するthrows_okで簡単に書けるけど、これを標準のlimeでやろうとすると、
<?php try { $threw = false; $obj->hoge(); // throw Exception } catch (Exception $e) { $threw = true; $t->is( $e->getMessage(), 'HOGEHOGE' ); } $t->ok( $threw === true, 'threw Exception' );
みたいなテストを書くことになって面倒。(追記:サンプルコードのクォート閉じ忘れ修正しました。コメント欄参照)
もちろん、lime_testを拡張すればよしなに書けるんだけど、それも能がないので、limeにプラグインを読み込む機能を付けて、そこで例外を補足するテストメソッドを提供してみました。
lime_testの代わりにlime_test_pluggualbeをnewしてloadPluginsすると、プラグインが提供するpublicなメソッドが$tから呼べるようになります。
<?php require 'lib/lime/pluggable.php'; $t = new lime_test_pluggable(); $t->loadPlugins('exception'); $a = 1; $b = 2; $e = $t->throws_ok( array($a, $b), 'if ($p[0] !== $p[1]) { throw new Exception("not equal"); }', 'not equal' ); echo $e->getMessage(); // "not equal"
みたいに書くとExceptionの発生と、getMessage()によるメッセージの比較をしてくれます。(追記:上記サンプルコードのプラグイン名が間違ってました。打ち消し線がコードの中で使えないっぽいので削除)(2010/07/14追記:lime本体の変更で動かなくなっていたのでコードを修正。「$t->output = new lime_output_color();」を削除)
引数名が妙なことになっているのは、create_functionに$pという名前で渡してるから。PHP5.3になるともう少し自然に書けるのかな。引数周りちゃんと見てないから分かんないや。
ErrorExceptionとか自前で定義したExceptionを投げる場合は、'not equal'の部分にExceptionのクラス名を与えます。get->Message()とかは、$eを取得した後で自由にテストを書くという想定です。
もう1つ、limeはisとかisntでスカラ値を評価するのに == を使っているのが気に入らなかったので、そのへんを === で評価するlime_plugin_strictもリポジトリに入れました。
<?php $t->false( strpos($haystack, $needle) );
みたいに0とFALSEを区別する必要がある時に使います。
その他、詳細はこちらで。