7

我如何编写一个自定义断言,例如assertFoo($expected, $actual),它的行为类似于关于错误“堆栈跟踪”的内置断言?

我目前定义了以下方法(在扩展的类中PHPUnit_Framework_TestCase):

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

第 17 行是assertFoo()调用内置函数assertEquals()并失败的地方;第 136 行assertFoo()被调用。

如果我将测试更改为assertEquals()直接调用,我只会得到一个:

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

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

手册中有一些文档,但似乎没有涵盖这一点。

4

1 回答 1

4

我对这个问题的第一个猜测(你没有使用其中一个PHPUnit_Framework_Constraint_*对象和self::assertThat)结果证明是完全不相关的!实际的答案是 phpUnit 有助于从堆栈跟踪中过滤掉它自己的代码库中的任何内容,而只是将函数留在用户空间中!

执行此操作的代码可以在/path/to/PHPUnit/Util/Filter.php中找到(其中/path/to/在我的机器上是/usr/share/php),感兴趣的函数是getFilteredStacktraceisFiltered

如果您想控制这种行为,请将您的自定义断言放入派生自 的类中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 回答