2012-07-31 11 views
6

assertFoo($expected, $actual)のようなカスタムアサーションを作成するにはどうしたらよいですか?エラーは「スタックトレース」に関して組み込みのアサーションのように振る舞いますか?組み込みのアサーションのように動作するカスタムPHPUnitアサーションを作成するには?

私は現在、(PHPUnit_Framework_TestCaseを拡張するクラス内)が定義され、以下の方法があります。

:私はテストからこれを呼び出すと、テストが失敗した場合、私は、コールスタック内の2つのアイテムを取得

public static function assertFoo($expected, $actual) { 
    self::assertEquals($expected, $actual); 
} 

1) PreferencesTest::testSignupTeacher 
Failed asserting that 5 matches expected 3. 

/vagrant/myproject/tests/integration/PreferencesTest.php:17 
/vagrant/myproject/tests/integration/PreferencesTest.php:136 

ここで、assertFoo()は組み込みのassertEquals()を呼び出して失敗します。 136行目にはassertFoo()が呼び出されています。

私が直接assertEquals()を呼び出すためのテストを変更した場合、私は一つだけを得る:

1) PreferencesTest::testSignupTeacher 
Failed asserting that 3 is true. 

/vagrant/myproject/tests/integration/PreferencesTest.php:136 

一部documentation in the manualがありますが、これをカバーしていないようです。

+0

assertFoo()関数のコードを表示できますか? –

+0

@DarrenCook確かに更新されました。 – mjs

答えて

3

私が最初に(PHPUnit_Framework_Constraint_*のオブジェクトとself::assertThatのいずれかを使用していない)という推測は完全に無関係であることが判明しました。実際の答えは、phpUnitがスタックトレースから何かを自分のコードベースの中でフィルタリングして、ユーザ空間に関数を残すことです。

これは(/パス/に/は自分のマシン上を/ usr/share/PHPある)/path/to/PHPUnit/Util/Filter.phpで見つけることができないコードと関心のある機能はgetFilteredStacktraceisFilteredです。

この動作を制御したい場合は、カスタムアサートをPHPUnit_Framework_TestCaseから派生したクラスに入れて、そのクラスからテストを引き出します。あなたが持っている別のファイルに続いて

class My_Base_TestCase extends PHPUnit_Framework_TestCase{ 
    public static function assertFoo($expected, $actual) { 
    self::assertEquals($expected, $actual); 
    } 
} 

PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'DEFAULT'); 

を:ここに示すように、カスタムクラスファイルでは、どこかaddFileToFilterへの呼び出しを入れ

class CustomTest extends My_Base_TestCase{ 

    /** */ 
    public function testSomething2(){ 
    $this->assertFoo(8, 5+4); 
    } 
} 

、それだけで、内蔵assertEquals()のように動作します。

免責事項:これは文書化されていない動作を使用しています。私は、このメカニズムが将来的に合理的であるかどうかを試してみるつもりです。

+1

残念ながら、PHPUnit_Util_Filter :: addFileToFilter()は3.5で消えてしまったようです。 3.6の方法では、どのファイルを削除するかを知るために 'PHPUnit_Util_GlobalState :: phpunitFiles()'を使用しているようですが、静的な静的な静的な静的な方法です... 'PHPUnit_Util_Filter :: getFilteredStacktrace()'の動​​作を変更する方法はありません3.6。 – mjs

+0

@mjs Ha!将来的にはそれほど大丈夫ではない、ごめんなさい!私はphpUnit 3.4.5を見ていたはずです。私がチャンスを得たら、明日最新phpUnitを見ていきます。 –

+0

PHPUnit 6で、あなたは '\ PHPUnit \ Util \ Blacklist :: $ blacklistedClassNames ['My_Base_TestCase'] = 1;'を実行する必要があります –

関連する問題