Symfony 4.2 Как сделать сервис общедоступным только для тестов - PullRequest
0 голосов
/ 31 января 2019

У меня есть решение сделать сервис общедоступным.В 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 голосов
/ 01 февраля 2019

Хорошо.Таким образом, существует проблема о тестировании частных сервисов, которые нигде не используются в вашем приложении.Он все еще открыт и обсуждается, но в основном на данный момент вам нужно набрать подсказку против вашего частного сервиса где-то в вашем приложении, прежде чем вы сможете получить к нему доступ в тесте.

Использование новой версии 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());
    }
}

Напечатайте свой сервис в конструкторе контроллера, и все будет работать как положено.

0 голосов
/ 01 февраля 2019

Вам нужно создать в config/config_test.yml и объявить, что служба общедоступна, и там есть другая конфигурация для тестов.

Этот подход вы можете использовать в Symfony 3 / 4.

Вы можете прочитатьучебное пособие здесь: https://symfonycasts.com/screencast/phpunit/integration-tests

О Функция простого тестирования Symfony 4.1 пожалуйста, прочитайте @Cerad post

0 голосов
/ 01 февраля 2019

ВЫ НЕ!:)

Вместо этого вы используете новый Более простой сервисный тест , реализованный в Symfony 4.1.

При этом тесты на основе 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 в средах тестирования.

0 голосов
/ 01 февраля 2019

Автоматическое подключение существует Начиная с Symfony 3.4, но с версией 4.x, он активирован по умолчанию.

Итак, все ваши классы внутри каталога / src общедоступны и настроены как службы.

Перейдите на / config / services.yaml , вы найдете этот код:

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}'

Это означает, что ваш / src / Services / PhpDocxService.php файл может быть вызван App / Services / PhpDocxService

Решение, которое вы нашлиэто позвонить в вашу службу по $this->getContainer()->get('test_phpdocxService');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...