PHPUnitは、明らかに同一の文字列に対するassertEqualsの失敗を私に与えますか?

次のスクリプトは、(ヘッダーコメントで)問題を実証し、文書化しています。つまり、 "expected"と "actual"の文字列の違いを検出できません。

<?php

/*
$ phpunit MyTest.php
PHPUnit 3.4.0 by Sebastian Bergmann.

F

Time: 0 seconds

There was 1 failure:

1) MyTest::test_print_r
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}
+O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}

.../MyTest.php:41
.../bin/phpunit:54

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
*/

class MyClass {
    static protected $var2;
    private $var3;
    public $var1;

    public function foo($item) {
        echo $item . "\n";
    }
}

class MyTest extends PHPUnit_Framework_TestCase {
    function test_print_r() {
        $m = new MyClass();
        $this->assertEquals(trim('O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}'), trim(serialize($m)));
    }
}
4

1 答え

かなり古いPHPUnitバージョンを使用しているため、この問題は表示されません。現在のバージョンは 3.6.5 です。可能であれば、アップグレードする必要があります。

PHPUnit > 3.6 will show a differnt diff to you when the string contains unprintable characters. As is the case here.

より最新のバージョンを使用した出力です。それがなぜ失敗するかの説明は以下の通りです:

phpunit
PHPUnit 3.6.5 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 3.25Mb

There was 1 failure:

1) MyTest::test_print_r
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'O:7:"MyClass":2:{s:13:"MyClassvar3";N;s:4:"var1";N;}'
+Binary String: 0x4f3a373a224d79436c617373223a323a7b733a31333a22004d79436c6173730076617233223b4e3b733a343a2276617231223b4e3b7d

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

説明

直列化されたphp文字列には、privateおよびprotectedクラス変数を示す NULL BYTES が含まれています。

文字列 "MyClassvar3" は実際には "\ 0MyClass \ 0var3" です。

アサーションを修正するには:

$this->assertEquals(
    "O:7:\"MyClass\":2:{s:13:\"\x00MyClass\x00var3\";N;s:4:\"var1\";N;}",
    serialize($m)
);

これを使用すると、テストが機能します。


9
追加された
@PeterいいえPHPUnit 3.6は、PHP 5.2.7以上で動作します。 (5.2.6でもうまく動作します)。 phpunit --force --alldeps phpunit/phpunit PHP 5.3を必要とする最初のPHPUnitバージョンはPHPUnit 3.7であり、しばらくの間はリリースされません。
追加された 著者 edorian,
+1は完璧な答えです。私はテスト環境で動作を確認するとすぐに「受け入れられる」とマークします。
追加された 著者 Peter,
残念ながら、公式のテスト環境をPHP 5.3にアップグレードすることはできません。PHP 5.3で必要とされています。しかし、その答えは有効であり、したがって受け入れられます。
追加された 著者 Peter,
私は、PHPUnit 3.6が実際にPHP 5.3を必要としないないというニュースを聞いて嬉しいです(私はPHP 5.2.17を当面使用しています)。 PHPUnit 3.6にはPHP 5.2.7(またはそれ以降)が必要ですが、PHP 5.3.8(またはそれ以降)をお勧めします。 マニュアルの第3章を参照してください。ありがとう!
追加された 著者 Peter,
vimで NULL BYTES と入力して "* var3" という文字列を "\ x00 * \ x00var3" insterモードではCtrl-v> 000です。
追加された 著者 consatan,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com