我怎么可以编写自定义断言,像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
这里也有一些在手册中的文档 ,但它似乎并没有涵盖这一点。
我对这个问题的第一个猜想(即你不使用的一个PHPUnit_Framework_Constraint_*
对象和self::assertThat
)竟然是完全不相干的! 实际的答案是有益的PHPUnit从堆栈中过滤掉跟踪在它自己的代码库什么,只是离开的功能在用户空间!
执行此的代码可以在/path/to/PHPUnit/Util/Filter.php(其中/路径/要/是/ usr /共享/我的机器上的PHP)和感兴趣的功能都可以找到getFilteredStacktrace
和isFiltered
。
如果你想控制这种行为,然后把你的自定义断言成从派生的类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?