Can phpunit compare two different objects asserting that their properties are identical?

Viewed 2191

This following test passes because true == 1, but I would like to write a test that fails since true !== 1.

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

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

The following test fails because the two variables do not reference the same object, but I would like to write a test that passes since true === true.

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

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

Therefore, does phpunit offer a native way to compare two different objects asserting that their properties are identical?

I have seen solutions (hacks) which convert the objects into arrays in then use $this->assertEqualsCanonicalizing(), or serialize the objects and then use this->assertEquals(), and so on. However, these solutions are not ideal for large objects which have properties consisting of a few different data types. Respectively, the canonicalization fails when attempting to convert a data type (such as DateTime to float), or the error message produced after serialization is hundreds of lines long making it tedious to find one difference.

Therefore, does phpunit offer a native way to compare two different objects asserting that their properties are identical?

For now, the only reliable solution we have is to write a specific test for each property. Perhaps this decision by phpunit is deliberate in order to force more robust unit tests.

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

The above test works as desired for the purpose of comparing objects, although we will need to loop through all of our properties and assertSame for each one.

0 Answers
Related