我们正在使用PHPUnit来测试应用程序的各个部分。在某些测试中,我们希望更改参数的值或覆盖服务(但仅适用于该测试,不适用于所有测试)。
在测试中动态配置Symfony容器的推荐方法是什么?
我们遇到的问题是容器在动态设置配置时不会重新编译(因为它只在文件发生变化时重新编译)。
答案 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());