symfony + кодовое восприятие - новые услуги не могут быть получены - PullRequest
0 голосов
/ 23 января 2020

У меня есть следующие настройки:

Symfony 5 проект, с кодовым восприятием 4.

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

Test  tests/integration/Shop/NewServiceCest.php:testSomething
Step  Grab service "App\Service\NewService"
Fail  Service App\Service\NewService is not available in container

Сервисный код ниже (в основном пустой):

<?php

namespace App\Service;

class NewService
{

    public function __construct()
    {

    }

}

Тестовый код ниже (опять же, в основном пусто):

<?php

namespace App\Tests\Integration\New;

use App\Exception\NewException;
use App\Service\NewService;
use App\Tests\IntegrationTester;

class NewServiceCest {

    private NewService $newService;

    public function _before(IntegrationTester $i) {
        $this->newService = $i->grabService(NewService::class);
    }

    public function testSomething(IntegrationTester $i) {
        // $i->expectThrowable(NewException::class, $this->newService->doStuff('invalidArgument'));
    }
}

Интеграционные тесты yml:

actor: IntegrationTester
modules:
    enabled:
        - Symfony:
              app_path: 'src'
              environment: 'test'
        - Doctrine2:
              depends: Symfony
              cleanup: true
              dump: 'tests/_data/integration.sql'
              populate: true
              reconnect: true
        - \App\Tests\Helper\Integration
        - Asserts

Я попытался очистить кэш, воссоздать его и т. д. c. все, что я мог придумать из cli, включая (текущий путь - это каталог проекта):

$./bin/console c:c
$./bin/console c:c --env=test
$rm -rf var (this should do nothing but still tried it)
$rm -rf tests/_support/_generated
$./bin/console cache:warmup --env=test
$./vendor/bin/codecept build

Когда я запустил тест, возникла та же проблема.

Что заставило его работать, было ввести где-нибудь (например, в контроллере), запустите контроллер, затем используйте ./vendor/bin/codecept build. После того, как я сделал эти шаги, тест работал как ожидалось. Очевидная проблема с этим заключается в том, что я пытаюсь создать конвейер для развертывания, где я поднимаю тестовую среду (чистую, на лету перед развертыванием на серверах), запускаю тесты и проверяю, что все в порядке. Внедрение всех сервисов куда-либо только для того, чтобы иметь возможность строить, не вариант (но я открыт для любых опций cli, включая выполнение большинства команд).

Еще более странно то, что после того, как я это сделал, теперь тест работает как и ожидалось, даже после того, как я очистил кеш (var и _generated). Как будто это сохранит что-то в другом месте, которое я, кажется, не могу найти (не могу найти никаких соответствующих конфигов относительно этого, и Google и bing меня не устраивают).

Итак ... почему это происходит и как я могу надежно заставить его работать?

1 Ответ

0 голосов
/ 25 февраля 2020

Наблюдается такое же поведение. Вновь созданный сервис не был доступен в коде через $I->grabService(NewService::class), если вы не используете этот сервис где-то еще в вашем коде (например, введите в какой-либо контроллер и т. Д. c.).

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

bin/console debug:container NewService --env=test не сообщал об ошибках. Я узнал об этом только после того, как попытался использовать NewService в каком-то тестовом контроллере, где было показано полезное сообщение об ошибке ...

...