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