Как правильно протестировать сервисный метод, использующий другие сервисы

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

Попытка модульного тестирования метода, имитируя каждую зависимость и относительные методы, которые он использует, просто делает тест бесполезным, на мой взгляд, поскольку то, что я тестирую, в некотором роде, это то, что другие службы вызываются правильно. Кроме того, как я читал в разных источниках, я не должен издеваться над тем, чем не владею, и в основном все такие методы используют хотя бы один (EntityManager, EncoderFactory и т. д...)

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

Это пример таких методов, которые я должен проверить:

public function postRequestCreatedActions(PrivacyRequest $request, $sendNotifications = true)
{
    $this->customLogger->logRequest($request);
    if ($sendNotifications) {
        $this->customMailer->sendRequestCreated($request);
    }
    $this->em->flush();
}

Итак, мой вопрос: если есть способ правильно протестировать такие методы (модульные или функциональные), как мне его протестировать?
Если такой метод не подлежит тестированию и его необходимо изменить или полностью удалить, как вы посоветуете провести его рефакторинг, не забивая контроллер, который его вызывает (каждый из них вызывается контроллером)? Или перенос всей этой логики на контроллер единственный выход?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
426
1

Ответы 1

Насколько я понимаю, вам нужно протестировать метод из вашего сервиса. Этот метод вызывает другие службы из внедренных зависимостей. Если это так, вам нужно создать экземпляр службы внутри теста, используя имитированные зависимости или просто аргументы, например (используя пророчество с предсказаниями метода вызова):

public function testPostRequestCreatedActions(): void
{
   $em = $this->prophesize(EntityManagerInterface::class);
   $em->flush()->willReturn(true)->shouldBeCalled();

   $request = $this->prophesize(PrivacyRequest::class);
   $logger = $this->prophesize(LoggerInterface::class);
   $logger->logRequest(Argument::any())->shouldBeCalled();

   $mailer = $this->prophesize(MailerInterface::class);
   $mailer->sendRequestCreated(Argument::any())->shouldNotBeCalled();

   $service = new Service($em->reveal(), $logger->reveal(), $mailer->reveal()); // assuming your service dependencies are in constructor

   $service->postRequestCreatedActions($request->reveal(), false);

}

P.S. Это не копипаста, а основная идея.

Другие вопросы по теме