【发布时间】:2018-12-24 21:58:45
【问题描述】:
我正在尝试将我的 Symfony 3.4 应用程序迁移到 Symfony 4.1。
测试不起作用,因为默认情况下服务是私有的(这是一个好消息)。
以下这个帖子:https://symfony.com/blog/new-in-symfony-4-1-simpler-service-testing,我仍然面临着私人服务的问题:
Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException:“my.service”服务或别名在容器编译时已被删除或内联。您应该将其公开,或者直接停止使用容器并改用依赖注入。
在下面的编译过程中,在$definitions 中找不到我的私人服务:vendor/symfony/framework-bundle/DependencyInjection/Compiler/TestServiceContainerRealRefPass.php
应该是什么问题?
更新
这里是定义:
<service id="my.service"
class="My\Bundle\GreatService">
<argument type="service" id="doctrine.orm.entity_manager" />
</service>
更新(再次)
这里是单元测试
<?php
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
class MyServiceTest extends KernelTestCase
{
protected $myService;
public function setUp()
{
self::bootKernel();
$this->myService = self::$container->get('my.service');
}
//...
}
【问题讨论】:
-
欢迎来到 Stack Overflow。请将您的 service.yml 的相关部分添加到您的问题中,以便我们可以看到回答您的问题所需的信息。另外,如果是特定的控制器,您应该添加失败的控制器的功能。
-
您是否尝试将此服务注入其他地方?如果是这样,您只需将其声明为 public :symfony.com/doc/current/service_container/…(只需将 public 设置为 true)
-
不,服务应该保持私有,我们通过依赖注入使用了这个服务。不使用容器。我们仅在单元测试中使用容器。为此,我关注了帖子:symfony.com/blog/new-in-symfony-4-1-simpler-service-testing
-
一个PHPUnit Mock 应该足够了。如果您确实需要该服务,那么您的架构就有问题。
-
这实际上是一个有趣的问题。 Some discussion here。将所有内容设置为公开的测试编译器通过可能是最好的选择。