在PHPUnit中,有时断言失败,并且在报告断言时,PHPUnit会自动调用变量上的var_export()。假设您调用了这段代码:
$foo = new StdClass();
$foo->bar = 123;
$foo->baz = "Hi there";
$this->assertTrue($foo);
输出是:
Failed asserting that
stdClass Object
(
[bar] => 123
[baz] => Hi there
)
is true.
如果变量是Exception对象,这可能导致单元测试在遍历对象树时打印出兆字节的文本,包括堆栈跟踪和其他信息。有时PHPUnit会因为内存不足而试图输出所有内容。
我知道一个解决方案是添加一个额外的测试,在执行assertTrue之前检查变量是否为对象,或者是assertEquals。但我的团队目前有很多单元测试。
所以我想知道是否有办法在生成错误报告时覆盖PHPUnit在变量上调用var_export的默认行为。
提前致谢。
答案 0 :(得分:1)
在挖掘了一些之后,我没有找到一个标志或者什么东西来实现这一点,所以我试图从代码中向后工作:
有问题的代码(print_r's)存在于:
PHPUnit_Framework_ComparisonFailure_Object
的{{1}}方法,我没有看到为该类提供另一个实现的方法而不更改phpunit中的代码(因为对象是在静态调用中创建的)
所以为了调试你可以改变它,但是那个.c。导致你在更改第三方代码时遇到的常见问题,因为你说你有很多代码,你可能不想这样做,因为你依赖phpunit按照每个人的预期工作。
一种不依赖于更改phpunit代码和的方式可能比通过所有测试并更改所有assertTrue()调用更麻烦可能是这样的:
如果您的所有测试都使用一个基类,则更容易放入:
toString()
- >
<?php
class ErrorTest extends PHPUnit_Framework_TestCase {
public function test1() {
$foo = new StdClass();
$foo->bar = 123;
$foo->baz = "Hi there";
$this->assertTrue($foo);
}
public static function assertTrue($x) {
if(is_object($x)) {
self::fail("Expecting True, got Object of Type: ".get_class($x));
}
parent::assertTrue($x);
}
}
虽然我不确定这是一个“好”的解决方案,但它是我现在能想到的最好的解决方案,也许它会有所帮助:)