PHPUnitでテスト内で発生したアサーションをテストする

2013-01-07T00:00:00+00:00 PHP PHPUnit

タイトルじゃ意味がわかりづらいかなと。簡単に言えば「本当にアサーションが発生しているのかをテストする」っていう事

例えばコールバックを引数に持つクラスメソッドを実行する前提のテストを行う際に、その引数に指定されたコールバックが実行されてそこでアサーションを行なってテストする場合、そのコールバックが正常に作動していなければアサーションが発生したとは考えにくいのではと。

でPerlとかの単体テストで使われるTest::Moreとかでは実行プランっていうのが存在しているので、想定されるテスト(アサーション)が保証する回数を前提にする事が出来る訳で。でこれをPHPUnitでやるにはどうすれば良いのかって

色々見た所だとどうもそういうのをサポートされてないような気もする。だけど、PHPUnit_Framework_Assert::getCountで取得する事が可能な模様。でテストする際にあたってはテスト毎(メソッド)にカウンタが初期化される模様(resetCountとかそういうメソッドもある)

という事でざっくり書くと

<?php

require "Hamcrest/Hamcrest.php";

class Test_Controller_Home extends TestCase {
    public function test1() {
        $this->assertTrue(true);

        assertThat(PHPUnit_Framework_Assert::getCount(), is(1));
    }
}

っていう事になる。但し、これ出来るのはあくまでPHPUnitのAssertなAPIを使った場合に限る模様。PHP版hamcrestを使う場合だと

<?php

require "Hamcrest/Hamcrest.php";

class Test_Controller_Home extends TestCase {
    public function test1() {
        Hamcrest_MatcherAssert::resetCount();

        assertThat(true, is(true));
        assertThat(Hamcrest_MatcherAssert::getCount(), 1);
    }
}

っていう感じでHamcrest_MatcherAssert::getCountを使えば良いが、複数のテストがある場合自動でリセットとかされる訳がないので自分でテスト前にリセットしたりしないといけない

んまぁっていう感じな手法使えば出来なくも無い

ContentProviderから返されたCursor実装を取る PHPUnit+Seleniumと雑多メモ