Unset all globals unneeded for unit tests, assert correct directory
[lhc/web/wiklou.git] / tests / phpunit / MediaWikiUnitTestCase.php
index 407be20..3f0fc7a 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Base class for MediaWiki unit tests.
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
 
 use PHPUnit\Framework\TestCase;
 
+/**
+ * Base class for unit tests.
+ *
+ * Extend this class if you are testing classes which use dependency injection and do not access
+ * global functions, variables, services or a storage backend.
+ */
 abstract class MediaWikiUnitTestCase extends TestCase {
        use PHPUnit4And6Compat;
        use MediaWikiCoversValidator;
+
+       private $unitGlobals = [];
+
+       protected function setUp() {
+               parent::setUp();
+               $reflection = new ReflectionClass( $this );
+               if ( strpos( $reflection->getFilename(), '/unit/' ) === 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 ( [ 'wgAutoloadClasses', 'wgAutoloadLocalClasses', 'IP' ] as $requiredGlobal ) {
+                       $GLOBALS[$requiredGlobal] = $this->unitGlobals[ $requiredGlobal ];
+               }
+       }
+
+       protected function tearDown() {
+               $GLOBALS = $this->unitGlobals;
+               parent::tearDown();
+       }
 }