Php 如何测试一个类的方法,该类执行一个以匿名函数作为参数的方法?

Php 如何测试一个类的方法,该类执行一个以匿名函数作为参数的方法?,php,symfony,phpunit,Php,Symfony,Phpunit,对于特定的需求,我必须在symfony 4.4项目中测试内核类,除了下面的registerContainerConfiguration()方法之外,一切都很好。它只包含一个方法,该方法将一个参数作为匿名函数,如何对其进行全面测试?我找不到办法进去 public function registerContainerConfiguration(LoaderInterface $loader) { $loader->load(function (ContainerBuilder $con

对于特定的需求,我必须在symfony 4.4项目中测试
内核
类,除了下面的
registerContainerConfiguration()
方法之外,一切都很好。它只包含一个方法,该方法将一个参数作为
匿名函数
,如何对其进行全面测试?我找不到办法进去

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:我尝试过,但它似乎只是模拟匿名函数。

一个想法是在测试目录中创建真正的加载程序类,用于测试目的,例如:

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);
 }