Почему PHPUnit дает мне ошибку assertEquals для идентичных строк? - PullRequest
4 голосов
/ 19 декабря 2011

Следующий скрипт демонстрирует и документирует (в заголовке комментария) проблему, а именно, что я не могу обнаружить разницу между «ожидаемой» и «фактической» строками:

<?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)));
    }
}

1 Ответ

9 голосов
/ 19 декабря 2011

Вы не видите проблему, потому что вы используете довольно старую версию PHPUnit. Текущая версия 3.6.5, и если вы можете, вы должны обновить.

PHPUnit> 3.6 покажет вам отличающиеся различия, если строка содержит непечатаемые символы. Как и здесь.

Вот вывод с использованием более актуальной версии. Объяснение того, почему это не удается, приведено ниже:

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 содержит NULL BYTES для обозначения закрытых и защищенных переменных класса.

Строка "MyClassvar3" действительно "\0MyClass\0var3".

Чтобы исправить утверждение:

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

Использование этого приведет к работе теста.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...