Как правильно протестировать метод сервиса, который использует другие сервисы - PullRequest
2 голосов
/ 26 марта 2019

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

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

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

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

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

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

1 Ответ

0 голосов
/ 27 марта 2019

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

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 Это не пример копирования-вставки, просто получите основную идею

...