3

スカラーを使用する場合:

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

テストOK

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

テストは失敗します

オブジェクトを使用する場合:

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

$ menu-> getChild('Projects')がnullかどうかに関して、テストOKまたは失敗

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

ハングしてエラーが発生します:zend_mm_heapが破損しています

AssertNullを使用すると、 AssertEquals(null、$ var)と同じ動作が得られません。今のところ、AssertNullの使用を禁止していますが、何が起こっているのか説明できるかどうか疑問に思っていました...

4

1 に答える 1

2

オブジェクトのタイプは次のとおりです: Knp\Menu\MenuItem (knpmenu 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 自体がそれ自体への参照を含むグローバル変数であるためです。

私は使用しています:

Sebastian Bergmann による PHPUnit 3.7.10。

PHP 5.4.7 (cli) (ビルド: 2012 年 9 月 12 日 23:48:31)

現時点での私の結論は、assertNull ではなくAssertEqualsを使用することです

于 2012-12-07T15:22:26.353 に答える