gpt4 book ai didi

phpunit - 如何编写行为类似于内置断言的自定义 PHPUnit 断言?

转载 作者:行者123 更新时间:2023-12-04 15:35:35 28 4
gpt4 key购买 nike

如何编写自定义断言,例如 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

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

最佳答案

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

免责声明:这是使用无证行为!我会尝试找出这种机制是否能够合理地适应 future 。

关于phpunit - 如何编写行为类似于内置断言的自定义 PHPUnit 断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746212/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com