如何编写自定义PHPUnit断言,其行为类似内置的说法对吗?(How to write custom

2019-07-30 17:48发布

我怎么可以编写自定义断言,像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

这里也有一些在手册中的文档 ,但它似乎并没有涵盖这一点。

Answer 1:

我对这个问题的第一个猜想(即你不使用的一个PHPUnit_Framework_Constraint_*对象和self::assertThat )竟然是完全不相干的! 实际的答案是有益的PHPUnit从堆栈中过滤掉跟踪在它自己的代码库什么,只是离开的功能在用户空间!

执行此的代码可以在/path/to/PHPUnit/Util/Filter.php(其中/路径/要// usr /共享/我的机器上的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()

免责声明:这是使用无证的行为! 我会试着找出如果这一机制将是合理的面向未来的。



文章来源: How to write custom PHPUnit assertion that behaves like built-in assertion?