[wp-trac] [WordPress Trac] #59482: Tests: Introduce Reflection API helper methods.

WordPress Trac noreply at wordpress.org
Thu Sep 28 03:39:43 UTC 2023


#59482: Tests: Introduce Reflection API helper methods.
--------------------------------------+-----------------------
 Reporter:  costdev                   |       Owner:  costdev
     Type:  enhancement               |      Status:  assigned
 Priority:  normal                    |   Milestone:  6.4
Component:  Build/Test Tools          |     Version:
 Severity:  normal                    |  Resolution:
 Keywords:  has-patch has-unit-tests  |     Focuses:
--------------------------------------+-----------------------
Description changed by costdev:

Old description:

> In unit tests, the Reflection API is often used to get or set a `private`
> or `protected` property's value, or to invoke a `private` or `protected`
> method.
>
> To do so, the `Reflection<Method|Property>::setAccessible()` method must
> be called with `true` before use, then should be called again with
> `false` afterwards. There are quite a lot of instances in the test suite
> where the Reflection API is used, and for a decent number of these,
> accessibility is not reset.
>
> For brevity, much like `assertSameSets()`, and to ensure that
> accessibility is always reset, this ticket aims to introduce new methods
> to the `WP_UnitTestCase_Base` class:
>
> `::reflect_and_invoke( object $obj, string $method, mixed ...$args ) :
> mixed`
>   - Reflects a `private` or `protected` method and invokes it.
>   - Returns the method's return value.
> `::reflect_and_get_value( object $obj, string $property ) : mixed`
>   - Reflects a `private` or `protected` property and gets its value.
>   - Returns the property's value.
> `::reflect_and_set_value() : void`
>   - Reflects a `private` or `protected` property and sets its value.
>
> While this means the creation of new `Reflection<Method|Property>`
> objects and two calls to `::setAccessible()` for each, I think that this
> is worthwhile as it helps us have a more robust test suite, with less
> code to write in test methods. Plus, we could also explore possible
> caching in future.

New description:

 In unit tests, the Reflection API is often used to get or set a `private`
 or `protected` property's value, or to invoke a `private` or `protected`
 method.

 To do so, the `Reflection<Method|Property>::setAccessible()` method must
 be called with `true` before use, then should be called again with `false`
 afterwards. There are quite a lot of instances in the test suite where the
 Reflection API is used, and for a decent number of these, accessibility is
 not reset.

 For brevity, much like `assertSameSets()`, and to ensure that
 accessibility is always reset, this ticket aims to introduce new methods
 to the `WP_UnitTestCase_Base` class:

 `::reflect_and_invoke( object $obj, string $method, mixed ...$args ) :
 mixed`
   - Reflects a `private` or `protected` method and invokes it.
   - Returns the method's return value.
 `::reflect_and_get_value( object $obj, string $property ) : mixed`
   - Reflects a `private` or `protected` property and gets its value.
   - Returns the property's value.
 `::reflect_and_set_value() : mixed`
   - Reflects a `private` or `protected` property and sets its value.
   - Returns the previous value for convenient resetting.

 While this means the creation of new `Reflection<Method|Property>` objects
 and two calls to `::setAccessible()` for each, I think that this is
 worthwhile as it helps us have a more robust test suite, with less code to
 write in test methods. Plus, we could also explore possible caching in
 future.

--

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


More information about the wp-trac mailing list