*
* Extend this class if you are testing classes which use dependency injection and do not access
* global functions, variables, services or a storage backend.
+ *
+ * @since 1.34
*/
abstract class MediaWikiUnitTestCase extends TestCase {
use PHPUnit4And6Compat;
use MediaWikiCoversValidator;
+ use MediaWikiTestCaseTrait;
+
+ private $unitGlobals = [];
+
+ protected function setUp() {
+ parent::setUp();
+ $reflection = new ReflectionClass( $this );
+ $dirSeparator = DIRECTORY_SEPARATOR;
+ if ( strpos( $reflection->getFilename(), "${dirSeparator}unit${dirSeparator}" ) === false ) {
+ $this->fail( 'This unit test needs to be in "tests/phpunit/unit"!' );
+ }
+ $this->unitGlobals = $GLOBALS;
+ unset( $GLOBALS );
+ $GLOBALS = [];
+ // Add back the minimal set of globals needed for unit tests to run for core +
+ // extensions/skins.
+ foreach ( $this->unitGlobals['wgPhpUnitBootstrapGlobals'] ?? [] as $key => $value ) {
+ $GLOBALS[ $key ] = $this->unitGlobals[ $key ];
+ }
+ }
+
+ protected function tearDown() {
+ $GLOBALS = $this->unitGlobals;
+ parent::tearDown();
+ }
+ /**
+ * Create a temporary hook handler which will be reset by tearDown.
+ * This replaces other handlers for the same hook.
+ * @param string $hookName Hook name
+ * @param mixed $handler Value suitable for a hook handler
+ * @since 1.34
+ */
+ protected function setTemporaryHook( $hookName, $handler ) {
+ // This will be reset by tearDown() when it restores globals. We don't want to use
+ // Hooks::register()/clear() because they won't replace other handlers for the same hook,
+ // which doesn't match behavior of MediaWikiIntegrationTestCase.
+ global $wgHooks;
+ $wgHooks[$hookName] = [ $handler ];
+ }
}