class UnitTestCase
Same name in other branches
- 9 core/tests/Drupal/Tests/UnitTestCase.php \Drupal\Tests\UnitTestCase
- 8.9.x core/tests/Drupal/Tests/UnitTestCase.php \Drupal\Tests\UnitTestCase
- 10 core/tests/Drupal/Tests/UnitTestCase.php \Drupal\Tests\UnitTestCase
Provides a base class and helpers for Drupal unit tests.
Module tests extending UnitTestCase must exist in the Drupal\Tests\your_module\Unit namespace and live in the modules/your_module/tests/src/Unit directory.
Tests for core/lib/Drupal classes extending UnitTestCase must exist in the \Drupal\Tests\Core namespace and live in the core/lib/tests/Drupal/Tests/Core directory.
Using Symfony's dump() function in Unit tests will produce output on the command line.
Hierarchy
- class \Drupal\Tests\UnitTestCase extends \PHPUnit\Framework\TestCase uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Prophecy\PhpUnit\ProphecyTrait, \Drupal\TestTools\Extension\DeprecationBridge\ExpectDeprecationTrait, \Drupal\Tests\RandomGeneratorTrait
Expanded class hierarchy of UnitTestCase
Related topics
693 files declare their use of UnitTestCase
- AcceptHeaderMatcherTest.php in core/
tests/ Drupal/ Tests/ Core/ Routing/ AcceptHeaderMatcherTest.php - AccessAwareRouterTest.php in core/
tests/ Drupal/ Tests/ Core/ Routing/ AccessAwareRouterTest.php - AccessGroupAndTest.php in core/
modules/ block_content/ tests/ src/ Unit/ Access/ AccessGroupAndTest.php - AccessManagerTest.php in core/
tests/ Drupal/ Tests/ Core/ Access/ AccessManagerTest.php - AccessPolicyProcessorTest.php in core/
tests/ Drupal/ Tests/ Core/ Session/ AccessPolicyProcessorTest.php
File
-
core/
tests/ Drupal/ Tests/ UnitTestCase.php, line 35
Namespace
Drupal\TestsView source
abstract class UnitTestCase extends TestCase {
use PhpUnitCompatibilityTrait;
use ProphecyTrait;
use ExpectDeprecationTrait;
use RandomGeneratorTrait;
/**
* The app root.
*
* @var string
*/
protected $root;
/**
* {@inheritdoc}
*/
public static function setUpBeforeClass() : void {
parent::setUpBeforeClass();
VarDumper::setHandler(TestVarDumper::class . '::cliHandler');
}
/**
* {@inheritdoc}
*/
protected function setUp() : void {
parent::setUp();
// Ensure that an instantiated container in the global state of \Drupal from
// a previous test does not leak into this test.
\Drupal::unsetContainer();
// Ensure that the NullFileCache implementation is used for the FileCache as
// unit tests should not be relying on caches implicitly.
FileCacheFactory::setConfiguration([
FileCacheFactory::DISABLE_CACHE => TRUE,
]);
// Ensure that FileCacheFactory has a prefix.
FileCacheFactory::setPrefix('prefix');
$this->root = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)), 2);
chdir($this->root);
}
/**
* Returns a stub config factory that behaves according to the passed array.
*
* Use this to generate a config factory that will return the desired values
* for the given config names.
*
* @param array $configs
* An associative array of configuration settings whose keys are
* configuration object names and whose values are key => value arrays for
* the configuration object in question. Defaults to an empty array.
*
* @return \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\Config\ConfigFactoryInterface
* A mock configuration factory object.
*/
public function getConfigFactoryStub(array $configs = []) {
$config_get_map = [];
$config_editable_map = [];
// Construct the desired configuration object stubs, each with its own
// desired return map.
foreach ($configs as $config_name => $config_values) {
// Define a closure over the $config_values, which will be used as a
// returnCallback below. This function will mimic
// \Drupal\Core\Config\Config::get and allow using dotted keys.
$config_get = function ($key = '') use ($config_values) {
// Allow to pass in no argument.
if (empty($key)) {
return $config_values;
}
// See if we have the key as is.
if (isset($config_values[$key])) {
return $config_values[$key];
}
$parts = explode('.', $key);
$value = NestedArray::getValue($config_values, $parts, $key_exists);
return $key_exists ? $value : NULL;
};
$immutable_config_object = $this->getMockBuilder('Drupal\\Core\\Config\\ImmutableConfig')
->disableOriginalConstructor()
->getMock();
$immutable_config_object->expects($this->any())
->method('get')
->willReturnCallback($config_get);
$config_get_map[] = [
$config_name,
$immutable_config_object,
];
$mutable_config_object = $this->getMockBuilder('Drupal\\Core\\Config\\Config')
->disableOriginalConstructor()
->getMock();
$mutable_config_object->expects($this->any())
->method('get')
->willReturnCallback($config_get);
$config_editable_map[] = [
$config_name,
$mutable_config_object,
];
}
// Construct a config factory with the array of configuration object stubs
// as its return map.
$config_factory = $this->createMock('Drupal\\Core\\Config\\ConfigFactoryInterface');
$config_factory->expects($this->any())
->method('get')
->willReturnMap($config_get_map);
$config_factory->expects($this->any())
->method('getEditable')
->willReturnMap($config_editable_map);
return $config_factory;
}
/**
* Returns a stub config storage that returns the supplied configuration.
*
* @param array $configs
* An associative array of configuration settings whose keys are
* configuration object names and whose values are key => value arrays
* for the configuration object in question.
*
* @return \Drupal\Core\Config\StorageInterface
* A mocked config storage.
*/
public function getConfigStorageStub(array $configs) {
$config_storage = $this->createMock('Drupal\\Core\\Config\\NullStorage');
$config_storage->expects($this->any())
->method('listAll')
->willReturn(array_keys($configs));
foreach ($configs as $name => $config) {
$config_storage->expects($this->any())
->method('read')
->with($this->equalTo($name))
->willReturn($config);
}
return $config_storage;
}
/**
* Returns a stub translation manager that just returns the passed string.
*
* @return \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\StringTranslation\TranslationInterface
* A mock translation object.
*/
public function getStringTranslationStub() {
$translation = $this->createMock('Drupal\\Core\\StringTranslation\\TranslationInterface');
$translation->expects($this->any())
->method('translate')
->willReturnCallback(function ($string, array $args = [], array $options = []) use ($translation) {
return new TranslatableMarkup($string, $args, $options, $translation);
});
$translation->expects($this->any())
->method('translateString')
->willReturnCallback(function (TranslatableMarkup $wrapper) {
return $wrapper->getUntranslatedString();
});
$translation->expects($this->any())
->method('formatPlural')
->willReturnCallback(function ($count, $singular, $plural, array $args = [], array $options = []) use ($translation) {
$wrapper = new PluralTranslatableMarkup($count, $singular, $plural, $args, $options, $translation);
return $wrapper;
});
return $translation;
}
/**
* Sets up a container with a cache tags invalidator.
*
* @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_validator
* The cache tags invalidator.
*
* @return \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit\Framework\MockObject\MockObject
* The container with the cache tags invalidator service.
*/
protected function getContainerWithCacheTagsInvalidator(CacheTagsInvalidatorInterface $cache_tags_validator) {
$container = $this->createMock('Symfony\\Component\\DependencyInjection\\ContainerInterface');
$container->expects($this->any())
->method('get')
->with('cache_tags.invalidator')
->willReturn($cache_tags_validator);
\Drupal::setContainer($container);
return $container;
}
/**
* Returns a stub class resolver.
*
* @return \Drupal\Core\DependencyInjection\ClassResolverInterface|\PHPUnit\Framework\MockObject\MockObject
* The class resolver stub.
*/
protected function getClassResolverStub() {
$class_resolver = $this->createMock('Drupal\\Core\\DependencyInjection\\ClassResolverInterface');
$class_resolver->expects($this->any())
->method('getInstanceFromDefinition')
->willReturnCallback(function ($class) {
if (is_subclass_of($class, 'Drupal\\Core\\DependencyInjection\\ContainerInjectionInterface')) {
return $class::create(new ContainerBuilder());
}
else {
return new $class();
}
});
return $class_resolver;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary | Overrides |
---|---|---|---|---|
ExpectDeprecationTrait::expectDeprecation | public | function | Adds an expected deprecation. | |
ExpectDeprecationTrait::getCallableName | private static | function | Returns a callable as a string suitable for inclusion in a message. | |
ExpectDeprecationTrait::setUpErrorHandler | public | function | Sets up the test error handler. | |
ExpectDeprecationTrait::tearDownErrorHandler | public | function | Tears down the test error handler. | |
RandomGeneratorTrait::getRandomGenerator | protected | function | Gets the random generator for the utility methods. | |
RandomGeneratorTrait::randomMachineName | protected | function | Generates a unique random string containing letters and numbers. | |
RandomGeneratorTrait::randomObject | public | function | Generates a random PHP object. | |
RandomGeneratorTrait::randomString | public | function | Generates a pseudo-random string of ASCII characters of codes 32 to 126. | |
UnitTestCase::$root | protected | property | The app root. | |
UnitTestCase::getClassResolverStub | protected | function | Returns a stub class resolver. | |
UnitTestCase::getConfigFactoryStub | public | function | Returns a stub config factory that behaves according to the passed array. | |
UnitTestCase::getConfigStorageStub | public | function | Returns a stub config storage that returns the supplied configuration. | |
UnitTestCase::getContainerWithCacheTagsInvalidator | protected | function | Sets up a container with a cache tags invalidator. | |
UnitTestCase::getStringTranslationStub | public | function | Returns a stub translation manager that just returns the passed string. | |
UnitTestCase::setUp | protected | function | 367 | |
UnitTestCase::setUpBeforeClass | public static | function |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.