Symfony 4.2如何仅针对测试公开服务

时间:2019-01-31 17:29:28

标签: php symfony phpunit

我有将服务公开的解决方案。在services.yml

    test_phpdocxService:
          alias: App\Service\PhpDocxService
          public: true

我尝试访问该服务:

$container = self::$container;
$phpDocxService = $container->get('test_phpdocxService');

$this->filename = $phpDocxService->generateDocxDocument('docx/aaa.html.twig', $data);

但是我发现它不是很好。还有另一种方法吗?

4 个答案:

答案 0 :(得分:3)

您需要在config/config_test.yml中创建并声明该服务是公共的,并且在那里进行测试的其他配置。

您可以在symfony 3/4中使用这种方法。

您可以在此处阅读教程:topic at this AWS support forum

关于https://symfonycasts.com/screencast/phpunit/integration-tests,请阅读@Cerad帖子

答案 1 :(得分:1)

好的。因此,有issue关于测试您的应用程序中未使用的私有服务的信息。它仍然是开放的并且正在讨论中,但是基本上,就目前而言,您需要在应用程序中的某个地方针对您的私有服务键入提示,然后才能在测试中访问它。

使用全新的4.4.2安装:

# src/Service/PhpDocxService.php
namespace App\Service;
class PhpDocxService
{
    public function sayHello()
    {
        return 'hello';
    }
}

# src/Controller/MyController.php
namespace App\Controller;

use App\Service\PhpDocxService;


class MyController
{
    #****** This is the secret ******
    public function __construct(PhpDocxService $phpDocxService)
    {

    }
}

# src/tests/MyTest.php
namespace App\Tests;

use App\Service\PhpDocxService;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class MyTest extends WebTestCase
{
    public function testServiceFound()
    {
        self::bootKernel();

        // gets the special container that allows fetching private services
        $container = self::$container;

        $phpDocxService = $container->get(PhpDocxService::class);

        $this->assertEquals('hello',$phpDocxService->sayHello());
    }
}

在控制器的构造函数中键入服务提示,一切都会按预期进行。

答案 2 :(得分:0)

自动装配自Symfony 3.4开始存在,但在4.x版本中,默认情况下已激活。

因此,/ src目录中的所有类都是公共的,并被设置为服务。

转到 /config/services.yaml ,您将找到以下代码:

def student_page(request, html_file):
if request.user.is_authenticated:
    if request.user.groups.filter(name__in=[group]).exists():
        return render(request, 'Students/%s.html'%(html_file), {})
    else:
        return redirect('accounts:login')
else:
    return redirect('accounts:login')

这意味着您的 /src/Services/PhpDocxService.php 文件可由 App / Services / PhpDocxService 调用strong>

找到的解决方案是通过services: # default configuration for services in *this* file _defaults: autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/*' exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}' 呼叫服务

答案 3 :(得分:0)

您不要! :)

相反,您使用在Symfony 4.1中实现的新Simpler service testing

有了它,基于WebTestCase和KernelTestCase的测试现在可以通过static :: $ container属性访问一个特殊的容器,该属性允许获取未删除的私有服务

这意味着如果您使用该容器,则私有服务会在测试中自动公开。

只需执行以下操作:

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class SomeClassToTest extends WebTestCase
{
    public function getService(string $service)
    {
        self::bootKernel();
        $container = self::$kernel->getContainer();
        $container = self::$container;

        return self::$container->get($service);
    }

    public function tesSomething()
    {
        $imageProcessor = $this->getService('app.some.service');
    }

现在,您可以在测试环境中获得私有的“ app.some.service”服务。