PHPUnit assertNull 函数出现 zend_mm_heap 错误

3

当使用标量时:

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

测试通过

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

测试失败

使用对象时:

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

测试 $menu->getChild('Projects') 是否为 null,判断结果为通过或失败。

$this->assertNull($menu->getChild('Projects'));

出现了卡顿并出现错误:zend_mm_heap corrupted

使用AssertNull时,我没有得到与AssertEquals(null, $var)相同的行为;目前,我禁止使用AssertNull,但我想知道其中的原因...


我遇到了完全相同的问题,也发现我的 PHP 在 print_r 行处挂起。更改为 assertEquals 解决了我的问题,谢谢。我已经进行了更多的调试,但仍然不知道如何正确解决它。 - Bram Gerritsen
1个回答

2

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

问题是与phpunit库中的一个函数相关的递归问题。

类:PHPUnit/Util/Type

函数:recursiveExport

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

$value 内容

正如你所看到的,子对象有一个对父对象的引用,这就是死锁的原因。

但是当我阅读print_r的文档时,它指出:

在 PHP 4.0.4 之前,如果给定包含对自身直接或间接引用的数组或对象,则 print_r() 将无限期地继续执行。例如,print_r($GLOBALS),因为 $GLOBALS 是一个包含对自身引用的全局变量。

我正在使用:

PHPUnit 3.7.10 by Sebastian Bergmann.

PHP 5.4.7 (cli) (built: Sep 12 2012 23:48:31)

我的结论是,暂时不要使用assertNull而是使用AssertEquals


如果有人能够理解并告诉我这个问题是来自于PHP还是我的错误,我将非常感激。 - Alexandre Mélard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接