我正在尝试将我的 Symfony 3.4 应用程序迁移到 Symfony 4.1。
测试不起作用,因为这些服务默认是私有的(这是一个好消息)。
在这篇文章之后:https://symfony.com/blog/new-in-symfony-4-1-simple-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>
Run Code Online (Sandbox Code Playgroud)
更新(再次)
这里是单元测试
<?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');
}
//...
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是上面的代码不起作用。当我使用 symfony 4.0 时,我使用了这样的技巧:
1.services_test.yaml在config文件夹中添加以下内容:
services:
_defaults:
public: true
test.my.service: "@my.service"
Run Code Online (Sandbox Code Playgroud)
2.现在您可以从容器中获取服务:
$this->myService = self::$container->get('test.my.service')
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您是否在某处注入此服务,因为默认情况下会删除未使用的服务(如果它们不是公共或合成的)。