Я застрял в том, как правильно протестировать метод в службе Symfony, единственной целью которого является вызов других методов в других службах.
Попытка модульного тестирования метода, имитируя каждую зависимость и относительные методы, которые он использует, просто делает тест бесполезным, на мой взгляд, поскольку то, что я тестирую, в некотором роде, это то, что другие службы вызываются правильно.
Кроме того, как я читал в разных источниках, я не должен издеваться над тем, чем не владею, и в основном все такие методы используют хотя бы один (EntityManager, EncoderFactory и т. д...)
Попытка функционально проверить его с загрузкой ядра, захватом службы и вызовом метода была кошмаром, и я застрял на утверждении, что электронные письма были отправлены, так как мне нужен клиент и ответ, чтобы захватить все электронные письма, которые были отправлены из профайлера.
Это пример таких методов, которые я должен проверить:
public function postRequestCreatedActions(PrivacyRequest $request, $sendNotifications = true)
{
$this->customLogger->logRequest($request);
if ($sendNotifications) {
$this->customMailer->sendRequestCreated($request);
}
$this->em->flush();
}
Итак, мой вопрос: если есть способ правильно протестировать такие методы (модульные или функциональные), как мне его протестировать?
Если такой метод не подлежит тестированию и его необходимо изменить или полностью удалить, как вы посоветуете провести его рефакторинг, не забивая контроллер, который его вызывает (каждый из них вызывается контроллером)? Или перенос всей этой логики на контроллер единственный выход?






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