Запустите консольную команду Symfony в тесте Codeception, не сохраняющем изменения в db, никаких ошибок не возникает

У меня странная проблема с тестом, который я пытаюсь запустить. Я использую сообщение sqs, чтобы подписаться на тему. Сообщение обрабатывается, и тест проходит, но после завершения теста в базе данных не происходит никаких изменений. Никаких исключений из доктрины не выбрасывается, ничего. Это происходит только тогда, когда я использую sqs. Я создал компонент контроллера для тестирования с другой конечной точкой, он работает нормально, и я могу видеть изменения в базе данных.

Я использую codeception, чтобы установить сообщение sqs. Класс SqsService принимает сообщение и возвращается ко мне после вызова QUEUE. У меня есть командный класс, который вызывается, когда я запускаю очередь из моего теста:

runSymfonyConsoleCommand('queue:<command>', ['--queue' => <queue-name>])

После этого я хочу обработать сообщение, чтобы внести изменения в базу данных, просто сделав это в моем классе обслуживания:

$this->repository->remove($entity);
$this->repository->flush();

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

Все работает нормально, за исключением того, что никаких изменений в базе данных не ожидается. Я проверил все конфигурации доктрины, и все они настроены правильно. Я использую Symfony 4.3.9

Кто-нибудь знает, что может вызвать эту проблему?


person Levinski Polish    schedule 09.12.2019    source источник


Ответы (1)


Оказывается, это был простой компонент кодирования, отправляющий событие в доктрину. См. При использовании метода codeception:

runSymfonyConsoleCommand();

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

Моя работа заключалась в использовании модуля codeception под названием CLI: https://codeception.com/docs/modules/Cli#seeShellOutputMatches

Метод:

runShellCommand($command);

Хотя, если вы ожидаете возврата значения от выполнения команды, вам следует просто использовать встроенный метод PHP:

shell_exec();

Метод codeception использует exec (); под капотом, поэтому по умолчанию он возвращает null.

Надеюсь, это поможет сообществу, спасибо.

person Levinski Polish    schedule 10.12.2019