wordpress-develop/tests/phpunit/includes
Sergey Biryukov 12f5012718 Build/Test Tools: Remove magic methods from WP_UnitTestCase_Base (without a backward compatibility break).
These magic methods were introduced to prevent a backward compatibility break, but in actual fact:

1. ''Caused'' a backward compatibility break. The original `$factory` property was a `static` property and this declared property was replaced by the magic methods. Unfortunately, it was not realized at the time that these magic methods **''are not called for static property access''**.[[BR]][[BR]]
 > Property overloading only works in object context. These magic methods will not be triggered in static context.
 And as approaching a static property in a non-static manner is [https://3v4l.org/93HQL not supported in PHP], this effectively created a backward compatibility break instead of preventing it.

2. Were hiding errors in tests, as the magic methods would be invoked for non-existent properties and would return `null` (get) or `false` (isset). See [54040], [54041], and [54077] for bug fixes related to this.

3. Are problematic in relation to PHP 8.2, as the implementation is incomplete, does not protect against dynamic properties and hides PHP notices about undefined properties.

Now, there were several options to mitigate this:

1. Revert the original commit. This would be problematic, as the ''non-static'' version of these properties has now been supported for 7 years, so this would create a new backward compatibility break.

2. Improve the magic methods. With all the issues with magic methods (see the discussion in the [https://www.youtube.com/watch?v=vDZWepDQQVE livestream from August 16, 2022], this would probably cause more problems than it’s worth and would make for a much more complex implementation, which is over the top for this relatively simple functionality, especially in the context of a test suite.

3. Remove the magic methods without adding the property. This would again cause a backward compatibility break, though one for which the mitigation solution would be relatively straightforward, i.e. to replace property access using `$this->factory` with a function call `$this->factory()` (or `self::factory()`, as the method is declared as static).    While we can (and have in a subsequent commit) mitigate this for the WP Core test suite, mitigating this for plugin or theme integration tests is outside of our purview and they would still need to deal with this backward compatibility break.

4. The current solution: removing the magic methods, explicitly declaring the (non-static) property and setting it in the `set_up()` method. This does not constitute a backward compatibility break with the functionality as it was over the past 7 years. Setting the property in `set_up()` may be “late”, but that is the earliest place in which the property can be set as non-static. If the factory would be needed prior to `set_up()`, the (static) `WP_UnitTestCase_Base::factory()` method should be called directly. This is no different from how this functionality behaved over the past 7 years.

Note: The property is straight away marked as “deprecated”, since the method should be favored over the use of the property.

Reference: [https://www.php.net/manual/en/language.oop5.overloading.php#object.get PHP Manual: Property overloading: __get()]

Follow-up to [35225], [35242].

Props jrf, costdev.
See #56514.

git-svn-id: https://develop.svn.wordpress.org/trunk@54087 602fd350-edb4-49c9-b593-d223f7449a82
2022-09-06 22:00:11 +00:00
..
factory Docs: Corrections and improvements to types used in docblocks for symbols, properties, and filters. 2021-07-01 21:01:17 +00:00
phpunit6 Build/Test Tools: Alias the Getopt class conditionally, as the class no longer exists in PHPUnit 9.x. 2021-08-07 10:46:54 +00:00
abstract-testcase.php Build/Test Tools: Remove magic methods from WP_UnitTestCase_Base (without a backward compatibility break). 2022-09-06 22:00:11 +00:00
bootstrap.php Build/Test Tools: Only define WP_PLUGIN_DIR when running core tests. 2022-08-17 21:03:06 +00:00
class-basic-object.php REST API: Support 'object' and 'array' types in register_meta() schemas. 2019-08-15 17:16:21 +00:00
class-basic-subclass.php Build/Test tools: Remove unnecessary PHP functionality tests from the test suite. 2017-12-09 23:08:24 +00:00
class-jsonserializable-object.php Code Modernization: Fix "JsonSerializable_Object::jsonSerialize() should be compatible with JsonSerializable::jsonSerialize(): mixed" error on PHP 8.1. 2021-07-30 14:46:30 +00:00
class-wp-fake-block-type.php Blocks: Introduce WP_Block_Type and WP_Block_Type_Registry classes. 2018-12-13 09:43:29 +00:00
class-wp-rest-test-configurable-controller.php REST API: Don't assume all item schemas have properties. 2020-02-20 16:56:17 +00:00
class-wp-rest-test-search-handler.php REST API: Introduce controller for searching across post types. 2018-12-13 09:37:05 +00:00
class-wp-sitemaps-empty-test-provider.php Docs: Various corrections and improvements relating to types used in inline documentation. 2021-11-18 13:48:43 +00:00
class-wp-sitemaps-large-test-provider.php Docs: Various corrections and improvements relating to types used in inline documentation. 2021-11-18 13:48:43 +00:00
class-wp-sitemaps-test-provider.php Docs: Various corrections and improvements relating to types used in inline documentation. 2021-11-18 13:48:43 +00:00
class-wp-test-stream.php Code Modernization: Explicitly declare all properties in WP_Test_Stream. 2022-08-28 10:09:39 +00:00
exceptions.php Docs: Improve documentation for tests/phpunit/includes/testcase-ajax.php. 2020-01-05 15:31:10 +00:00
factory.php Code Modernization: Replace dirname( __FILE__ ) calls with __DIR__ magic constant. 2020-02-06 06:31:22 +00:00
functions.php Tools: Automate backporting core blocks from Gutenberg to Core 2022-07-08 12:32:37 +00:00
install.php Coding Standards: Move wp-includes/wp-db.php to wp-includes/class-wpdb.php. 2022-07-21 15:58:51 +00:00
mock-fs.php Coding Standards: Add public visibility to methods in tests/phpunit/includes/. 2021-11-04 13:15:33 +00:00
mock-image-editor.php Media: apply the wp_editor_set_quality filter not only when loading an image in the editor but also when saving an converted image, after the mime-type of the output image has changed. 2021-08-31 18:57:09 +00:00
mock-invokable.php Docs: Miscellaneous DocBlock corrections. 2021-11-24 23:58:20 +00:00
mock-mailer.php Coding Standards: Add public visibility to methods in tests/phpunit/includes/. 2021-11-04 13:15:33 +00:00
normalize-xml.xsl Sitemaps: Add XML sitemaps functionality to WordPress. 2020-06-17 15:22:49 +00:00
object-cache.php Tests: Remove the list of non-persistent groups in Memcached implementation used in the test suite. 2022-08-04 15:37:15 +00:00
phpunit-adapter-testcase.php Build/Test Tools: Use the PHPUnit Polyfill TestCase as void workaround. 2021-08-07 10:20:05 +00:00
plural-form-function.php Coding Standards: Use static closures when not using $this. 2021-08-26 12:57:08 +00:00
spy-rest-server.php Docs: Miscellaneous DocBlock corrections. 2021-11-24 23:58:20 +00:00
testcase-ajax.php Build/Test Tools: Implement use of the void solution. 2021-08-07 10:29:41 +00:00
testcase-canonical.php Build/Test Tools: Declare two TestCase classes as abstract. 2021-08-09 14:51:05 +00:00
testcase-rest-api.php Tests: Replace most instances of assertEquals() in phpunit/includes/ with assertSame(). 2021-02-10 13:23:42 +00:00
testcase-rest-controller.php Build/Test Tools: Remove the assertion in filter_rest_url_for_leading_slash(). 2021-12-19 14:27:22 +00:00
testcase-rest-post-type-controller.php Tests: Use more appropriate assertions in various tests. 2021-07-10 11:15:44 +00:00
testcase-xml.php Tests: Replace most instances of assertEquals() in phpunit/includes/ with assertSame(). 2021-02-10 13:23:42 +00:00
testcase-xmlrpc.php Docs: Various docblock improvements and corrections. 2021-11-08 10:47:55 +00:00
testcase.php Build/Test Tools: Change the inheritance order of the abstract test classes. 2021-08-06 00:44:00 +00:00
trac.php Docs: Fix typo in TracTickets::isTracTicketClosed() description. 2022-02-20 10:12:37 +00:00
unregister-blocks-hooks.php Tools: Automate backporting core blocks from Gutenberg to Core 2022-07-08 12:32:37 +00:00
utils.php Code Modernization: Let MockClass extend stdClass. 2022-08-07 16:53:30 +00:00
wp-profiler.php Coding Standards: Fix incorrect alignment in two comment blocks. 2021-08-05 13:10:05 +00:00