es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo verificar si una prueba de phpunit escribe una determinada entrada de registro / cómo verificar si se envían correos electrónicos

Tengo una clase de servicio en mi proyecto Symfony5 en PHP8, que envía correos electrónicos siguiendo ciertas reglas. Con mi prueba, quiero verificar si se envían los correos correctos. Esta tarea existe para varios proyectos, así que realmente quiero encontrar una solución para esto.

El método que recopila el receptor de los correos actualmente es privado y no se deben exponer sus métodos privados.

Una idea era escribir una entrada de registro para cada receptor potencial de correo. Pero, ¿cómo puedo verificar ciertos valores en mi archivo test.log?

Encontré un paquete que extiende PHPUnit solo para este propósito (https://github.com/phoenixrvd/phpunit-assert-log-entry), pero parece que no está mantenido.

¿Conoces una solución para:
* Verificar los registros de los mensajes
o
* Tener un método diferente para probar si se notifica a los receptores correctos?

Actualmente uso un Trait para agregar funcionalidad de registro a mi servicio, que tiene un método setter que establece el Logger a través de la anotación @required.


namespace App\Logger; use Psr\Log\LoggerInterface; trait LoggerTrait { private $logger; /** * @required */ public function setLogger(LoggerInterface $logger): void { $this->logger = $logger; } protected function logInfo(string $message, array $context = []) { if (null !== $this->logger) { $this->logger->info($message, $context); } } }
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución para verificar si se envían los correos correctos es crear un objeto simulado (mock) de la clase de envío de correo electrónico y utilizar el método “expects” para especificar el comportamiento esperado. De esta manera, puedes verificar si se llama al método con los parámetros correctos.

    Por ejemplo, en tu caso de prueba, puedes crear un objeto simulado de la clase de envío de correo electrónico de la siguiente manera:

    $emailSenderMock = $this->getMockBuilder(EmailSender::class)
        ->setMethods(['send'])
        ->getMock();
    

    Luego, puedes definir el comportamiento esperado utilizando el método “expects”:

    $emailSenderMock->expects($this->once())
        ->method('send')
        ->with($this->equalTo([$expectedReceivers]))
        ->willReturn(true);
    

    Finalmente, puedes inyectar el objeto simulado en tu servicio probado y llamar al método que desencadena el envío de correos electrónicos:

    $myService = new MyService($emailSenderMock);
    $myService->sendEmail();
    

    De esta manera, puedes probar fácilmente si los destinatarios correctos son notificados sin enviar realmente un correo electrónico.

    En cuanto al enfoque de registro, puedes usar el paquete integrado “WebProfilerBundle” de Symfony para inspeccionar los mensajes de registro en tiempo real durante el desarrollo. Cuando ejecutes tu conjunto de pruebas, también puedes configurar el registro para que los mensajes de registro se muestren en un archivo separado o en la consola. Luego, puedes analizar el archivo de registro o verificar la salida de la consola en tu caso de prueba para verificar si los mensajes de registro contienen los valores esperados.

Comments are closed.