test_helpers-1.0.0-alpha6/src/UnitTestCaseWrapper.php

src/UnitTestCaseWrapper.php
<?php

namespace Drupal\test_helpers;

use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Drupal\Tests\UnitTestCase;
use PHPUnit\Framework\MockObject\Generator\CannotUseAddMethodsException;
use PHPUnit\Framework\MockObject\MockBuilder;
use PHPUnit\Framework\MockObject\MockObject;

/**
 * A singleton class to provide UnitTestCase private functions as public.
 */
class UnitTestCaseWrapper extends UnitTestCase {

  /**
   * {@inheritdoc}
   */
  // To suppress "Possible useless method overriding detected" warning.
  // @codingStandardsIgnoreStart
  public function getRandomGenerator() {
    return parent::getRandomGenerator();
  }
  // @codingStandardsIgnoreEnd

  /**
   * {@inheritdoc}
   */
  // To suppress "Possible useless method overriding detected" warning.
  // @codingStandardsIgnoreStart
  public function getContainerWithCacheTagsInvalidator(CacheTagsInvalidatorInterface $cache_tags_validator) {
    return parent::getContainerWithCacheTagsInvalidator($cache_tags_validator);
  }
  // @codingStandardsIgnoreEnd

  /**
   * {@inheritdoc}
   */
  // To suppress "Possible useless method overriding detected" warning.
  // @codingStandardsIgnoreStart
  public function getClassResolverStub() {
    return parent::getClassResolverStub();
  }
  // @codingStandardsIgnoreEnd

  /**
   * {@inheritdoc}
   */
  // To suppress "Possible useless method overriding detected" warning.
  // @codingStandardsIgnoreStart
  public function createMockWrapped(string $originalClassName): MockObject {
    return parent::createMock($originalClassName);
  }
  // @codingStandardsIgnoreEnd

  /**
   * {@inheritdoc}
   */
  // To suppress "Possible useless method overriding detected" warning.
  // @codingStandardsIgnoreStart
  public function createPartialMockWrapped(string $originalClassName, array $methods): MockObject {
    return parent::createPartialMock($originalClassName, $methods);
  }
  // @codingStandardsIgnoreEnd

  /**
   * Creates a partial mock for the class and call constructor with arguments.
   *
   * @param string $originalClassName
   *   The name of the class to mock.
   * @param array $methods
   *   An array of methods to mock.
   * @param array $constructorArgs
   *   An array of arguments for the constructor.
   * @param array $addMethods
   *   An array with new methods to add into the mock.
   *
   * @return \PHPUnit\Framework\MockObject\MockObject
   *   The mocked object
   */
  public function createPartialMockWithConstructor(string $originalClassName, ?array $methods = NULL, ?array $constructorArgs = NULL, ?array $addMethods = NULL): MockObject {
    $mockBuilder = $this->getMockBuilder($originalClassName)
      ->setConstructorArgs($constructorArgs ?? [])
      ->disableOriginalClone();
    if (!empty($methods)) {
      $mockBuilder->onlyMethods($methods);
    }
    if (!empty($addMethods)) {
      $this->mockBuilderAddMethods($mockBuilder, $addMethods);
    }
    // @todo Try to add enableProxyingToOriginalMethods() function.
    return $mockBuilder->getMock();
  }

  /**
   * Adds new methods to the mock builder.
   *
   * A local re-implementation of the deprecated function
   * MockBuilder::addMethods() from PHPUnit 10.x.
   *
   * @param \PHPUnit\Framework\MockObject\MockBuilder $mockBuilder
   *   The mock builder.
   * @param array $addMethods
   *   An array with new methods to add into the mock.
   *
   * @throws \ReflectionException
   * @throws \PHPUnit\Framework\MockObject\Generator\CannotUseAddMethodsException
   */
  private function mockBuilderAddMethods(MockBuilder $mockBuilder, array $addMethods): void {
    $type = TestHelpers::getPrivateProperty($mockBuilder, 'type');
    try {
      $reflector = new \ReflectionClass($type);
    }
    catch (\ReflectionException $e) {
      throw new \ReflectionException(
        $e->getMessage(),
        $e->getCode(),
        $e,
      );
    }

    foreach ($addMethods as $method) {
      if ($reflector->hasMethod($method)) {
        throw new CannotUseAddMethodsException($type, $method);
      }
    }

    $methods = TestHelpers::getPrivateProperty($mockBuilder, 'methods');
    $methods = array_merge($methods, $addMethods);
    TestHelpers::setPrivateProperty($mockBuilder, 'methods', $methods);
  }

  /**
   * Creates a partial mock with ability to add custom methods.
   *
   * @param string $originalClassName
   *   The name of the class to mock.
   * @param array $methods
   *   An array of methods to mock.
   * @param array $addMethods
   *   An array with new methods to add into the mock.
   *
   * @return \PHPUnit\Framework\MockObject\MockObject
   *   The mocked object
   */
  public function createPartialMockWithCustomMethods(string $originalClassName, ?array $methods = NULL, ?array $addMethods = NULL): MockObject {
    $mockBuilder = $this->getMockBuilder($originalClassName)
      ->disableOriginalConstructor()
      ->disableOriginalClone();
    if (!empty($methods)) {
      $mockBuilder->onlyMethods($methods);
    }
    if (!empty($addMethods)) {
      // @todo Reimplement this function locally if the author removes it.
      // @see https://github.com/sebastianbergmann/phpunit/issues/5320
      // @phpstan-ignore-next-line
      $this->mockBuilderAddMethods($mockBuilder, $addMethods);
    }
    // @todo Try to add enableProxyingToOriginalMethods() function.
    return $mockBuilder->getMock();
  }

  /**
   * The class instance.
   *
   * @var static
   */
  private static $instance = NULL;

  /**
   * Gets the instance via lazy initialization (created on first usage).
   *
   * @return static
   */
  public static function getInstance() {
    if (!self::$instance) {
      $c = get_called_class();
      self::$instance = new $c('UnitTestCaseWrapper');
    }

    return self::$instance;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc