summaryrefslogtreecommitdiffstatshomepage
path: root/core/tests/Drupal/Tests/UnitTestCase.php
diff options
context:
space:
mode:
Diffstat (limited to 'core/tests/Drupal/Tests/UnitTestCase.php')
-rw-r--r--core/tests/Drupal/Tests/UnitTestCase.php29
1 files changed, 29 insertions, 0 deletions
diff --git a/core/tests/Drupal/Tests/UnitTestCase.php b/core/tests/Drupal/Tests/UnitTestCase.php
index 2257148d0698..b279bd1ed250 100644
--- a/core/tests/Drupal/Tests/UnitTestCase.php
+++ b/core/tests/Drupal/Tests/UnitTestCase.php
@@ -13,6 +13,7 @@ use Drupal\Core\StringTranslation\PluralTranslatableMarkup;
use Drupal\TestTools\Extension\DeprecationBridge\ExpectDeprecationTrait;
use Drupal\TestTools\Extension\Dump\DebugDump;
use PHPUnit\Framework\Attributes\BeforeClass;
+use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Prophecy\PhpUnit\ProphecyTrait;
use Symfony\Component\VarDumper\VarDumper;
@@ -210,4 +211,32 @@ abstract class UnitTestCase extends TestCase {
return $class_resolver;
}
+ /**
+ * Set up a traversable class mock to return specific items when iterated.
+ *
+ * Test doubles for types extending \Traversable are required to implement
+ * \Iterator which requires setting up five methods. Instead, this helper
+ * can be used.
+ *
+ * @param \PHPUnit\Framework\MockObject\MockObject&\Iterator $mock
+ * A mock object mocking a traversable class.
+ * @param array $items
+ * The items to return when this mock is iterated.
+ *
+ * @return \PHPUnit\Framework\MockObject\MockObject&\Iterator
+ * The same mock object ready to be iterated.
+ *
+ * @template T of \PHPUnit\Framework\MockObject\MockObject&\Iterator
+ * @phpstan-param T $mock
+ * @phpstan-return T
+ * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103
+ */
+ protected function setupMockIterator(MockObject&\Iterator $mock, array $items): MockObject&\Iterator {
+ $iterator = new \ArrayIterator($items);
+ foreach (get_class_methods(\Iterator::class) as $method) {
+ $mock->method($method)->willReturnCallback([$iterator, $method]);
+ }
+ return $mock;
+ }
+
}