Mercurial > hg > cmmr2012-drupal-site
diff core/tests/Drupal/Tests/PhpunitCompatibilityTrait.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tests/Drupal/Tests/PhpunitCompatibilityTrait.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,167 @@ +<?php + +namespace Drupal\Tests; + +/** + * Makes Drupal's test API forward compatible with multiple versions of PHPUnit. + */ +trait PhpunitCompatibilityTrait { + + /** + * Returns a mock object for the specified class using the available method. + * + * The getMock method does not exist in PHPUnit 6. To provide backward + * compatibility this trait provides the getMock method and uses createMock if + * this method is available on the parent class. + * + * @param string $originalClassName + * Name of the class to mock. + * @param array|null $methods + * When provided, only methods whose names are in the array are replaced + * with a configurable test double. The behavior of the other methods is not + * changed. Providing null means that no methods will be replaced. + * @param array $arguments + * Parameters to pass to the original class' constructor. + * @param string $mockClassName + * Class name for the generated test double class. + * @param bool $callOriginalConstructor + * Can be used to disable the call to the original class' constructor. + * @param bool $callOriginalClone + * Can be used to disable the call to the original class' clone constructor. + * @param bool $callAutoload + * Can be used to disable __autoload() during the generation of the test + * double class. + * @param bool $cloneArguments + * Enables the cloning of arguments passed to mocked methods. + * @param bool $callOriginalMethods + * Enables the invocation of the original methods. + * @param object $proxyTarget + * Sets the proxy target. + * + * @see \PHPUnit_Framework_TestCase::getMock + * @see https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-5.4.0 + * + * @return \PHPUnit_Framework_MockObject_MockObject + * + * @deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0. + * Use \Drupal\Tests\PhpunitCompatibilityTrait::createMock() instead. + * + * @see https://www.drupal.org/node/2907725 + */ + public function getMock($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = TRUE, $callOriginalClone = TRUE, $callAutoload = TRUE, $cloneArguments = FALSE, $callOriginalMethods = FALSE, $proxyTarget = NULL) { + if (!$this->supports('getMock')) { + $mock = $this->getMockBuilder($originalClassName) + ->setMethods($methods) + ->setConstructorArgs($arguments) + ->setMockClassName($mockClassName) + ->setProxyTarget($proxyTarget); + if ($callOriginalConstructor) { + $mock->enableOriginalConstructor(); + } + else { + $mock->disableOriginalConstructor(); + } + if ($callOriginalClone) { + $mock->enableOriginalClone(); + } + else { + $mock->disableOriginalClone(); + } + if ($callAutoload) { + $mock->enableAutoload(); + } + else { + $mock->disableAutoload(); + } + if ($cloneArguments) { + $mock->enableArgumentCloning(); + } + else { + $mock->disableArgumentCloning(); + } + if ($callOriginalMethods) { + $mock->enableProxyingToOriginalMethods(); + } + else { + $mock->disableProxyingToOriginalMethods(); + } + return $mock->getMock(); + } + else { + return parent::getMock($originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods, $proxyTarget); + } + } + + /** + * Returns a mock object for the specified class using the available method. + * + * The createMock method does not exist in PHPUnit 4. To provide forward + * compatibility this trait provides the createMock method and uses createMock + * if this method is available on the parent class or falls back to getMock if + * it isn't. + * + * @param string $originalClassName + * Name of the class to mock. + * + * @see \PHPUnit_Framework_TestCase::getMock + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + public function createMock($originalClassName) { + if ($this->supports('createMock')) { + return parent::createMock($originalClassName); + } + else { + return $this->getMock($originalClassName, [], [], '', FALSE, FALSE); + } + } + + /** + * Compatibility layer for PHPUnit 6 to support PHPUnit 4 code. + * + * @param mixed $class + * The expected exception class. + * @param string $message + * The expected exception message. + * @param int $exception_code + * The expected exception code. + */ + public function setExpectedException($class, $message = '', $exception_code = NULL) { + if (method_exists($this, 'expectException')) { + $this->expectException($class); + if (!empty($message)) { + $this->expectExceptionMessage($message); + } + if ($exception_code !== NULL) { + $this->expectExceptionCode($exception_code); + } + } + else { + parent::setExpectedException($class, $message, $exception_code); + } + } + + /** + * Checks if the trait is used in a class that has a method. + * + * @param string $method + * Method to check. + * + * @return bool + * TRUE if the method is supported, FALSE if not. + */ + private function supports($method) { + // Get the parent class of the currently running test class. + $parent = get_parent_class($this); + // Ensure that the method_exists() check on the createMock method is carried + // out on the first parent of $this that does not have access to this + // trait's methods. This is because the trait also has a method called + // createMock(). Most often the check will be made on + // \PHPUnit\Framework\TestCase. + while (method_exists($parent, 'supports')) { + $parent = get_parent_class($parent); + } + return method_exists($parent, $method); + } + +}