如何在PHPUnit测试中在Symfony中设置参数或服务?

时间:2017-02-01 15:56:22

标签: phpunit symfony

我们正在使用PHPUnit来测试应用程序的各个部分。在某些测试中,我们希望更改参数的值或覆盖服务(但仅适用于该测试,不适用于所有测试)。

在测试中动态配置Symfony容器的推荐方法是什么?

我们遇到的问题是容器在动态设置配置时不会重新编译(因为它只在文件发生变化时重新编译)。

4 个答案:

答案 0 :(得分:3)

这就是我们现在的行动方式:

class TestKernel extends \AppKernel
{
    public function __construct(\Closure $containerConfigurator, $environment = 'test', $debug = false)
    {
        $this->containerConfigurator = $containerConfigurator;

        parent::__construct($environment, $debug);
    }

    public function registerContainerConfiguration(LoaderInterface $loader)
    {
        parent::registerContainerConfiguration($loader);
        $loader->load($this->containerConfigurator);
    }

    /**
     * Override the parent method to force recompiling the container.
     * For performance reasons the container is also not dumped to disk.
     */
    protected function initializeContainer()
    {
        $this->container = $this->buildContainer();
        $this->container->compile();
        $this->container->set('kernel', $this);
    }
}

然后我们在PHPUnit基础测试类中添加了这个方法:

/**
 * Rebuilds the container with custom container configuration.
 *
 * @param \Closure $containerConfigurator Closure that takes the ContainerBuilder and configures it.
 *
 * Example:
 *
 *     $this->rebuildContainer(function (ContainerBuilder $container) {
 *         $container->setParameter('foo', 'bar');
 *     });
 */
public function rebuildContainer(\Closure $containerConfigurator) : ContainerInterface
{
    if ($this->kernel) {
        $this->kernel->shutdown();
        $this->kernel = null;
        $this->container = null;
    }

    $this->kernel = new TestKernel($containerConfigurator);
    $this->kernel->boot();
    $this->container = $this->kernel->getContainer();

    return $this->container;
}

答案 1 :(得分:0)

您不在单元测试中测试容器或配置。 在单元测试中,目标是在没有完整应用程序堆栈的情况下测试封装的单元。

对于功能测试,推荐的方法是在getLang()

下的继承配置中编辑它

可以在那里覆盖app/config/config_test.yml的所有值。

答案 2 :(得分:0)

从Symfony 5开始,可能存在捷径。只要您需要设置参数,就可以简单地在$_ENV变量中更改它们。即以下作品

services.yaml

services:
    App\Controller\ApiController:
        arguments:
            $param: '%env(my_param)%'

ApiController.php

class ApiController extends AbstractController
{
    public function __construct(string $param)
    {
        $this->param = $param;
    }
    ...
}

测试

class ApiControllerTest extends WebTestCase
{
    public function testSomething(): void
    {
        $_ENV['param'] = 'my-value';
        $client = self::createClient();
        $client->request(...)
    }
    ...
}

答案 3 :(得分:-1)

$ serializer = new \ JMS \ Serializer \ SerializerBuilder();        $ container-> set('jms_serializer',$ serializer :: create() - > build());