diff options
Diffstat (limited to 'core/tests/Drupal/Tests/UnitTestCase.php')
-rw-r--r-- | core/tests/Drupal/Tests/UnitTestCase.php | 29 |
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; + } + } |