7

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

現在、次のメソッドが定義されています(を拡張するクラス内PHPUnit_Framework_TestCase):

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

これをテストから呼び出してテストが失敗した場合、コール スタックに次の 2 つの項目が表示されます。

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

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

17 行目はassertFoo()、ビルトインを呼び出してassertEquals()失敗する場所です。136行目assertFoo()というところがあります。

テストをassertEquals()直接呼び出すように変更すると、次の 1 つしか得られません。

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

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

マニュアルにはいくつかのドキュメントがありますが、これをカバーしていないようです。

4

1 に答える 1

4

PHPUnit_Framework_Constraint_*私が最初に推測した問題 (オブジェクトの 1 つと を使用していないということself::assertThat) は、まったく無関係であることが判明しました。実際の答えは、phpUnit は独自のコードベース内のスタック トレースからフィルタを有効に取り除き、関数をユーザー空間に残すということです!

これを行うコードは/path/to/PHPUnit/Util/Filter.php (私のマシンでは/path/to//usr/share/phpです) にあり、対象の関数はgetFilteredStacktraceisFilteredです。

この動作を制御したい場合は、カスタム assert を から派生したクラスに入れ、PHPUnit_Framework_TestCaseそのクラスからテストを派生させます。addFileToFilter次に示すように、カスタム クラス ファイルに への呼び出しを配置し​​ます。

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

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

次に、別のファイルに次のものがあります。

class CustomTest extends My_Base_TestCase{

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

組み込みの と同じように動作しassertEquals()ます。

免責事項: これは文書化されていない動作を使用しています! このメカニズムが合理的に将来的に保証されるかどうかを調べてみます.

于 2012-08-02T01:28:23.300 に答える