【问题标题】:phpunit assertNull gets zend_mm_heap corruptedphpunit assertNull 被 zend_mm_heap 损坏
【发布时间】:2012-12-07 14:15:27
【问题描述】:

使用标量时:

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

测试正常

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

测试失败

使用对象时:

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

测试 $menu->getChild('Projects') 是否为空

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

挂起,我收到错误:zend_mm_heap 已损坏

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

【问题讨论】:

  • 我遇到了完全相同的问题,还发现我的 php 挂在 print_r 行上。更改为assertEquals 解决了我的问题,谢谢。我做了更多的调试,但仍然不知道如何正确修复它

标签: php symfony phpunit


【解决方案1】:

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

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

类:PHPUnit/Util/Type

函数:递归导出

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

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

但是当我阅读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

【讨论】:

  • 如果有人能指出这一点并解释我的问题是来自 PHP 还是来自我,我会很高兴?
猜你喜欢
  • 2018-11-19
  • 2016-01-28
  • 2016-01-15
  • 2017-08-20
  • 2012-02-17
  • 1970-01-01
  • 2011-01-15
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多