limeにプラグイン機構を乗っけてみた

symfonyのテストフレームワークlimePHP版の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を区別する必要がある時に使います。


その他、詳細はこちらで。