Как я могу проверить метод класса, который выполняет метод с анонимной функцией в качестве аргументов? - PullRequest
1 голос
/ 20 февраля 2020

Для конкретных потребностей c, я должен протестировать класс Kernel в проекте symfony 4.4, и все в порядке, кроме метода ниже registerContainerConfiguration(). Он содержит только один метод, который принимает аргумент как Anonymous function, как я могу полностью его протестировать? Я не могу найти способ войти в него.

public function registerContainerConfiguration(LoaderInterface $loader)
{
    $loader->load(function (ContainerBuilder $container) use ($loader) {
        $container->loadFromExtension('framework', [
            'router' => [
                'resource' => 'kernel::loadRoutes',
                'type' => 'service',
            ],
        ]);

        if (!$container->hasDefinition('kernel')) {
            $container->register('kernel', static::class)
                ->setSynthetic(true)
                ->setPublic(true)
            ;
        }

        $kernelDefinition = $container->getDefinition('kernel');
        $kernelDefinition->addTag('routing.route_loader');

        if ($this instanceof EventSubscriberInterface) {
            $kernelDefinition->addTag('kernel.event_subscriber');
        }

        $this->configureContainer($container, $loader);

        $container->addObjectResource($this);
    });
}

Код, который я уже написал:

public function testRegisterContainerConfiguration(): void
{
    $loader = $this->prophesize(LoaderInterface::class);

    $loader->load()
        ->shouldBeCalledOnce() // here i'm stuck
    ;

    $this->kernel->registerContainerConfiguration($loader->reveal());
}

PS: я попробовал этот , но это кажется, только издевается над анонимной функцией.

1 Ответ

1 голос
/ 26 февраля 2020

Одна идея состоит в том, чтобы создать настоящий класс загрузчика внутри тестового каталога для целей тестирования, например:

class LoaderMockObject implements LoaderInterface {
    //...

    public function __construct(ContainerBuilder $containerBuilder)
    {
        $this->containerBuilder = $containerBuilder;
    }

    public function load($resource, $type = null)
    {
        return $resource($this->containerBuilder);
    }

    // ...
}

Затем вы можете легко протестировать поведение containerBuilder следующим образом:

public function testRegisterContainerConfiguration()
    {
        $containerBuilder = $this->createMock(ContainerBuilder::class);

        $containerBuilder->expects($this->once())
            ->method('loadFromExtension')
            ->withAnyParameters();

        // other expectations

        $loaderMock = new LoaderMockObject($containerBuilder);
        $kernel = new Kernel('test', false);

        $kernel->registerContainerConfiguration($loaderMock);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...