Moh*_*ira 9 php symfony symfony4
我正在将项目迁移到Symfony4。在我的测试套件中,我们使用PHPUnit进行功能测试(我的意思是,我们调用端点,然后检查结果)。通常,我们模拟服务以检查不同的步骤。
自从我迁移到Symfony 4以来,我面临着这个问题:Symfony\Component\DependencyInjection\Exception\InvalidArgumentException: The "my.service" service is already initialized, you cannot replace it.
当我们像这样重新定义它时:static::$container->set("my.service", $mock);
仅用于测试,如何解决此问题?
谢谢
自 Symfony 3.3 起不推荐使用替换。您应该尝试使用别名而不是替换服务。 http://symfony.com/doc/current/service_container/alias_private.html
此外,您可以尝试这种方法:
$this->container->getDefinition('user.user_service')->setSynthetic(true);
在做之前 $container->set()
最后,我找到了解决方案。也许不是最好的,但是,它正在工作:
services我创建了另一个测试容器类,并使用反射覆盖该属性:
<?php
namespace My\Bundle\Test;
use Symfony\Bundle\FrameworkBundle\Test\TestContainer as BaseTestContainer;
class TestContainer extends BaseTestContainer
{
private $publicContainer;
public function set($id, $service)
{
$r = new \ReflectionObject($this->publicContainer);
$p = $r->getProperty('services');
$p->setAccessible(true);
$services = $p->getValue($this->publicContainer);
$services[$id] = $service;
$p->setValue($this->publicContainer, $services);
}
public function setPublicContainer($container)
{
$this->publicContainer = $container;
}
Run Code Online (Sandbox Code Playgroud)
内核.php:
<?php
namespace App;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
class Kernel extends BaseKernel
{
use MicroKernelTrait;
public function getOriginalContainer()
{
if(!$this->container) {
parent::boot();
}
/** @var Container $container */
return $this->container;
}
public function getContainer()
{
if ($this->environment == 'prod') {
return parent::getContainer();
}
/** @var Container $container */
$container = $this->getOriginalContainer();
$testContainer = $container->get('my.test.service_container');
$testContainer->setPublicContainer($container);
return $testContainer;
}
Run Code Online (Sandbox Code Playgroud)
这确实很难看,但它确实有效。
| 归档时间: |
|
| 查看次数: |
2896 次 |
| 最近记录: |