[wp-trac] [WordPress Trac] #30522: WP_UnitTestCase::assertEqualSets can pass incorrectly

WordPress Trac noreply at wordpress.org
Thu Nov 27 04:07:18 UTC 2014


#30522: WP_UnitTestCase::assertEqualSets can pass incorrectly
------------------------------+------------------------------
 Reporter:  dd32              |       Owner:
     Type:  defect (bug)      |      Status:  new
 Priority:  normal            |   Milestone:  Awaiting Review
Component:  Build/Test Tools  |     Version:
 Severity:  normal            |  Resolution:
 Keywords:                    |     Focuses:
------------------------------+------------------------------
Description changed by dd32:

Old description:

> WP_UnitTestCase::assertEqualSets currently allows different sized sets to
> be passed, which can hide errors in unit tests.
>
> Take for example the following unit test, I can't see a reason for why
> this should pass, and yet, it currently does:
> {{{
> $this->assertEqualSets( array( 1, 2, 3 ), array( 1, 2, 2, 3, 3, 3 ) );
> }}}
>
> There's a few options, including asserting the count is the same, however
> that doesn't work as something like this would then also pass:
> {{{
> $expected = array( 1, 2, 2 );
> $actual = array( 1, 1, 2 );
> $this->assertEqualSets( $expected, $actual );
> }}}
>
> The function currently only cares about the values (as it uses
> `array_diff()`), so we could simply perform a sort and then
> {{{assertEquals}}} the resulting array, that could account for the above
> cases.
>
> However, we also have some tests (Terms for example) which are testing
> `id=>slug`, those tests could have the incorrect `id` (array key) and
> still pass (both now, and with the sorting option), eg:
> {{{
> $expected = array(
>         1 => 'one',
>         100 => 'one hundred'
> );
> $actual = array(
>         50 => 'one',
>         500 => 'one hundred'
> );
> $this->assertEqualSets( $expected, $actual );
> }}}
>
> `assertEqualSets` was introduced in [1127/tests].

New description:

 WP_UnitTestCase::assertEqualSets currently allows different sized sets to
 be passed, which can hide errors in unit tests.

 Take for example the following unit test, I can't see a reason for why
 this should pass, and yet, it currently does:
 {{{
 $this->assertEqualSets( array( 1, 2, 3 ), array( 1, 2, 2, 3, 3, 3 ) );
 }}}

 There's a few options, including asserting the count is the same, however
 that doesn't work as something like this would then still pass:
 {{{
 $expected = array( 1, 2, 2 );
 $actual = array( 1, 1, 2 );
 $this->assertEqualSets( $expected, $actual );
 }}}

 The function currently only cares about the values (as it uses
 `array_diff()`), so we could simply perform a sort and then
 {{{assertEquals}}} the resulting array, that would account for the above
 cases.

 However, we also have some tests (Terms for example) which are testing
 `id=>slug`, those tests could have the incorrect `id` (array key) and
 still pass (both now, and with the sorting option), eg:
 {{{
 $expected = array(
         1 => 'one',
         100 => 'one hundred'
 );
 $actual = array(
         50 => 'one',
         500 => 'one hundred'
 );
 $this->assertEqualSets( $expected, $actual );
 }}}

 `assertEqualSets` was introduced in [1127/tests].

--

--
Ticket URL: <https://core.trac.wordpress.org/ticket/30522#comment:2>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform


More information about the wp-trac mailing list