Может ли phpunit сравнивать два разных объекта, утверждая, что их свойства идентичны? - PullRequest
0 голосов
/ 25 февраля 2020

Этот следующий тест проходит потому, что true == 1, но я хотел бы написать тест, который не проходит, так как true !== 1.

$stdClass1 = new stdClass();
$stdClass1->foo = true;
$stdClass2 = new stdClass();
$stdClass2->foo = 1;

$this->assertEquals(
    $stdClass1,
    $stdClass2
);

Следующий тест не пройден, поскольку две переменные не ссылаются на один и тот же объект , но я хотел бы написать тест, который проходит с true === true.

$stdClass1 = new stdClass();
$stdClass1->foo = true;
$stdClass2 = new stdClass();
$stdClass2->foo = true;

$this->assertSame(
    $stdClass1,
    $stdClass2
);

. Поэтому предлагает ли phpunit собственный способ сравнения двух разных объектов, утверждая, что их свойства идентичны?

Я видел решения (хаки), которые преобразовывают объекты в массивы, затем используют $this->assertEqualsCanonicalizing(), или сериализуют объекты, а затем используют this->assertEquals() и так далее. Однако эти решения не идеальны для больших объектов, которые имеют свойства, состоящие из нескольких различных типов данных. Соответственно, канонизация завершается неудачно при попытке преобразовать тип данных (например, DateTime в float), или сообщение об ошибке, генерируемое после сериализации, состоит из сотен строк, что затрудняет поиск одного различия.

Следовательно, phpunit не работает предложить собственный способ сравнения двух разных объектов, утверждая, что их свойства идентичны?

На данный момент единственное надежное решение, которое у нас есть, - это написать конкретный c тест для каждого свойства. Возможно, это решение phpunit является преднамеренным, чтобы заставить более надежные модульные тесты.

$this->assertSame(
    $stdClass1->foo,
    $stdClass2->foo
);

Вышеупомянутый тест работает так, как требуется для сравнения объектов, хотя нам потребуется l oop через все наши свойства и assertSame для каждого.

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