我正在尝试将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');
}
//...
}
答案 0 :(得分:1)
奇怪的是,上面的代码不起作用。当我使用symfony 4.0时,我使用了以下技巧:
1。在services_test.yaml
文件夹中添加config
,内容如下:
services:
_defaults:
public: true
test.my.service: "@my.service"
2。现在您可以从容器中获得服务了
$this->myService = self::$container->get('test.my.service')
顺便说一句,您是否将此服务注入到某个地方,因为默认情况下会删除未使用的服务(如果它们不是公共的或合成的)。