EthnaでUnit Test その2

SimpleTestのassert〜〜ってのは全て、独自のメッセージを渡せるようになってます。
例えば以下のように引数を渡すと

function test_foo()
{
    $num = 0;
    /*
     * 何か処理
     */
    $this->assertIdentical($num, 0, 'numの値が0であるか検証');
}
numの値が0であるか検証 at  [ファイルパス line 行]

と実行時に表示してくれます。assertが増えてきた場合に識別しやすくて便利ですね。


でも、メッセージを渡すとちょっと問題が出てきます。
例えば、$numの値が0では無かった場合に

Fail numの値が0であるか検証 at  [ファイルパス line 行]

としか出力されず、え?じゃあ、値はいくつだったの?ってことが多々あります。


デフォは比較した値を表示してくれるんですが、メッセージを渡すとそれが消えちゃうんですね。
SimpleTestのunit_tester.phpを見てもらうとわかると思いますが、assert〜〜は、

function assertIdentical($first, $second, $message = '%s') {

といった感じなので、デフォルト引数の%s*1を上書きしちゃって元メッセージが表示されなくなっちゃいます。
例えば、'numの値が0であるか検証 (%s)' といった感じで渡してやれば共存できるんですが、何度もそんなことを書くのは面倒くさいと。
SimpleTestのassert〜〜は最終的にSimpleTestCaseクラスのassertにたどり着くっぽいので、こいつを無理やりオーバーライドしてやれば、自分の独自メッセージ + デフォルトメッセージを共存させることができます。

前記事で作成したAppid_UniteTestCaseに

function assert(&$expectation, $compare, $message = '%s') {
    return parent::assert($expectation, $compare, $message == '%s' ? $message : "{$message} (%s)");
}
Fail numの値が0であるか検証 (Identical expectation [Integer: 1] fails with [Integer: 0]
because [Integer: 1] differs from [Integer: 0] by 1) at [ファイルパス line 行]

といった感じで追加してやれば自分の好きなようにある程度変更できます。第3引数が気持ち悪いことになってますが…。
「もっと凝ったメッセージを渡したいんだ!」と言う方は向かないかもしれませんが、「確認できればそれでOKだYo!」みたいな人はこんな感じで問題ないかなと。

*1: 最終的にsprintfでメッセージに置き換えられる