phpunit assertNull使zend_mm_heap损坏

时间:2012-12-07 14:15:28

标签: php symfony phpunit

使用标量时:

$null = null;
$this->assertNull($null);

测试OK

$null = 'not null';
$this->assertNull($null);

测试失败

使用对象时:

$this->assertEquals(null, $menu->getChild('Projects'));

如果$ menu-> getChild('Projects')为null或

,则测试正常或失败
$this->assertNull($menu->getChild('Projects'));

挂起并收到错误消息: zend_mm_heap已损坏

使用 AssertNull 时,我没有得到与 AssertEquals(null,$ var)相同的行为; 目前,我禁止使用AssertNull,但我想知道你是否有人能解释发生了什么......

1 个答案:

答案 0 :(得分:2)

对象的类型为: Knp \ Menu \ MenuItem (来自knpmenu php库的对象)

问题是与phpunit库中的函数关联的递归问题。

class: PHPUnit / Util / Type

function: recursiveExport

preg_match_all('/\n            \[(\w+)\] => Array\s+\*RECURSION\*/', print_r($value, TRUE), $matches);

$value content

如您所见,子进程有父对象的引用,这就是死锁的原因。

当我阅读 print_r 的文档时,声明:

  

在PHP 4.0.4之前,如果给定一个包含对自身的直接或间接引用的数组或对象,print_r()将永远继续。一个例子是print_r($ GLOBALS),因为$ GLOBALS本身就是一个包含对自身的引用的全局变量。

我正在使用:

  

Sebastian Bergmann撰写的PHPUnit 3.7.10。

     

PHP 5.4.7(cli)(建于2012年9月12日23:48:31)

我目前的结论是,使用 assertNull AssertEquals