2012-07-31 104 views
6

如何编写自定义断言,如assertFoo($expected, $actual),其行为与关于错误“堆栈跟踪”的内置断言相似?如何编写自定义PHPUnit断言,其行为如同内置断言?

我现在已经定义了下面的方法(即扩展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 

有一些documentation in the manual,但它似乎并没有涵盖这一点。

+0

你可以显示你的assertFoo()函数的代码。 – 2012-07-31 23:36:08

+0

@DarrenCook当然,更新。 – mjs 2012-08-01 14:03:38

回答

3

我对这个问题的第一次猜测(你没有使用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()

免责声明:这是使用无证行为!我会试着找出这种机制是否会有合理的未来发展。

+1

不幸的是,它看起来像'PHPUnit_Util_Filter :: addFileToFilter()'在3.5中消失了。 3.6的方式似乎使用'PHPUnit_Util_GlobalState :: phpunitFiles()'来确定要删除哪些文件,这是静态静态的一路......我看不到任何方式来修改行为'PHPUnit_Util_Filter :: getFilteredStacktrace()'in 3.6。 – mjs 2012-08-02 12:06:04

+0

@mjs哈!那么不是所有的未来,对不起!我应该说我在看phpUnit 3.4.5。如果我有机会,我会在明天看看最新的phpUnit。 – 2012-08-02 12:56:30

+0

变成PHPUnit 6,你必须做'\ PHPUnit \ Util \ Blacklist :: $ blacklistedClassNames ['My_Base_TestCase'] = 1;' – 2018-03-03 14:20:19