diff --git a/src/Core/Extensible.php b/src/Core/Extensible.php index e23823d1c..de40620b6 100644 --- a/src/Core/Extensible.php +++ b/src/Core/Extensible.php @@ -3,12 +3,9 @@ namespace SilverStripe\Core; use InvalidArgumentException; -use SilverStripe\Control\RequestHandler; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\Deprecation; -use SilverStripe\ORM\DataExtension; -use SilverStripe\ORM\DataObject; use SilverStripe\View\ViewableData; /** @@ -214,6 +211,14 @@ trait Extensible return true; } + /** + * Clears all cached extra_methods cache data + */ + public static function flush_extra_methods_cache() + { + self::$extra_methods = []; + } + /** * Remove an extension from a class. diff --git a/src/Dev/State/ExtensionTestState.php b/src/Dev/State/ExtensionTestState.php index 29c4dd09c..4aeec1f48 100644 --- a/src/Dev/State/ExtensionTestState.php +++ b/src/Dev/State/ExtensionTestState.php @@ -30,6 +30,7 @@ class ExtensionTestState implements TestState */ public function setUp(SapphireTest $test) { + DataObject::flush_extra_methods_cache(); } public function tearDown(SapphireTest $test) @@ -104,23 +105,5 @@ class ExtensionTestState implements TestState public function tearDownOnce($class) { - // @todo: This isn't strictly necessary to restore extensions, but only to ensure that - // Object::$extra_methods is properly flushed. This should be replaced with a simple - // flush mechanism for each $class. - /** @var string|DataObject $dataClass */ - - // Remove extensions added for testing - foreach ($this->extensionsToRemove as $dataClass => $extensions) { - foreach ($extensions as $extension) { - $dataClass::remove_extension($extension); - } - } - - // Reapply ones removed - foreach ($this->extensionsToReapply as $dataClass => $extensions) { - foreach ($extensions as $extension) { - $dataClass::add_extension($extension); - } - } } } diff --git a/tests/php/Core/Injector/InjectorTest.php b/tests/php/Core/Injector/InjectorTest.php index 47c428ceb..b1dee54db 100644 --- a/tests/php/Core/Injector/InjectorTest.php +++ b/tests/php/Core/Injector/InjectorTest.php @@ -1065,6 +1065,7 @@ class InjectorTest extends SapphireTest /** @var Member|SomeExtension $member */ $member = new Member(); $this->assertTrue($member->hasExtension(SomeExtension::class)); + $this->assertTrue($member->hasMethod('someMethod')); $this->assertSame('bar', $member->someMethod()); } } diff --git a/tests/php/Core/Injector/InjectorTest/SomeCustomisedExtension.php b/tests/php/Core/Injector/InjectorTest/SomeCustomisedExtension.php index 8599558e4..9641d7df1 100644 --- a/tests/php/Core/Injector/InjectorTest/SomeCustomisedExtension.php +++ b/tests/php/Core/Injector/InjectorTest/SomeCustomisedExtension.php @@ -2,7 +2,9 @@ namespace SilverStripe\Core\Tests\Injector\InjectorTest; -class SomeCustomisedExtension extends SomeExtension +use SilverStripe\Dev\TestOnly; + +class SomeCustomisedExtension extends SomeExtension implements TestOnly { public function someMethod() { diff --git a/tests/php/Core/Injector/InjectorTest/SomeExtension.php b/tests/php/Core/Injector/InjectorTest/SomeExtension.php index 3f7e60ef4..4de0ab9c8 100644 --- a/tests/php/Core/Injector/InjectorTest/SomeExtension.php +++ b/tests/php/Core/Injector/InjectorTest/SomeExtension.php @@ -2,9 +2,10 @@ namespace SilverStripe\Core\Tests\Injector\InjectorTest; +use SilverStripe\Dev\TestOnly; use SilverStripe\ORM\DataExtension; -class SomeExtension extends DataExtension +class SomeExtension extends DataExtension implements TestOnly { public function someMethod() {