Prueba de correos electrónicos
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeCuando entramos en bloqueo, necesitamos enviar un correo electrónico. Antes de escribir el código para hacerlo, añadamos una aserción para ello.
Afirmar que se envía un correo electrónico
¿Cómo? Symfony nos cubre las espaldas: nos proporciona unos cuantos métodos relacionados con los correos electrónicos, como $this->assertEmailCount()
. Podemos afirmar muchas cosas sobre los correos electrónicos, pero por simplicidad, nos ceñiremos a esta sencilla cuenta.
// ... lines 1 - 12 | |
class LockDownHelperTest extends KernelTestCase | |
{ | |
// ... lines 15 - 33 | |
public function testDinoEscapedPersistsLockDown() | |
{ | |
// ... lines 36 - 39 | |
$this->assertEmailCount(1); | |
} | |
// ... lines 42 - 46 | |
} |
Ejecuta la prueba:
symfony php vendor/bin/phpunit tests/Integration/Service/LockDownHelperTest.php
Fallo épico, porque... ni siquiera tenemos mailer instalado todavía. ¡Hagámoslo! Ejecuta:
composer require symfony/mailer
Si te pregunta por la configuración de Docker, eso depende de ti, pero yo voy a decirYes permanently
. Hablaremos de lo que hizo eso en un minuto, pero no es superimportante.
De forma similar a una base de datos, necesitamos configurar nuestros parámetros de conexión a Mailer. Eso se hace en .env
a través de MAILER_DSN
. Descomenta esto. El transporte null
es un gran valor por defecto. Significa que los correos electrónicos no se enviarán realmente en los entornos dev o test. Y luego puedes anularlo en tu entorno de producción para establecerlo en algo real.
// ... lines 1 - 32 | |
MAILER_DSN=null://null | |
// ... lines 34 - 35 |
Si quieres cambiar esto por otra cosa en el entorno dev
, yo probablemente añadiría este transporte null
a .env.test
... porque está muy bien evitar el envío de correos electrónicos desde nuestras pruebas.
Muy bien, vuelve a tirar los dados de las pruebas:
symfony php vendor/bin/phpunit tests/Integration/Service/LockDownHelperTest.php
¡Mejor! Falla porque no hemos enviado ningún correo electrónico. ¡Hagámoslo!
Enviar el correo electrónico
En LockDownHelper
, autoconecta un servicio más:private MailerInterface $mailer
. Luego, aquí abajo, como esto no es un tutorial de Mailer, llama a un nuevo método sendEmailAlert()
... y lo pegaré. Pasa el ratón por encima de la clase Email
y pulsa "alt" + "enter" para añadir la sentenciaSymfony\Component\Mime\Email
use
.
// ... lines 1 - 8 | |
use Symfony\Component\Mailer\MailerInterface; | |
use Symfony\Component\Mime\Email; | |
// ... line 11 | |
class LockDownHelper | |
{ | |
public function __construct( | |
// ... lines 15 - 17 | |
private MailerInterface $mailer | |
) | |
{ | |
} | |
// ... lines 22 - 35 | |
public function dinoEscaped(): void | |
{ | |
// ... lines 38 - 42 | |
$this->sendEmailAlert(); | |
} | |
private function sendEmailAlert(): void | |
{ | |
$email = (new Email()) | |
->from('bob@dinotopia.com') | |
->to('staff@dinotopia.com') | |
->subject('PARK LOCKDOWN') | |
->text('RUUUUUUNNNNNN!!!!') | |
; | |
$this->mailer->send($email); | |
} | |
} |
¡Listo! Vuelve a la línea de comandos:
symfony php vendor/bin/phpunit tests/Integration/Service/LockDownHelperTest.php
¡Ya está! ¡La prueba ha pasado!
Ver correos electrónicos a través de MailCatcher
Por cierto, esto no está relacionado con las pruebas, pero una de las cosas buenas de utilizar la integración con Docker es que, cuando instalamos Mailer, añadió este servicio mailcatcher
.
// ... lines 1 - 2 | |
services: | |
// ... lines 4 - 10 | |
mailer: | |
image: schickling/mailcatcher | |
ports: ["1025", "1080"] | |
// ... lines 14 - 15 |
Ejecuta:
docker compose down
Luego
docker compose up -d
para iniciar el nuevo servicio. Ejecuta de nuevo la prueba. Sigue pasando. Sin embargo, como el servicio mailcatcher
está en marcha y ejecutamos nuestras pruebas a través del binario Symfony, éste anuló la variable de entorno MAILER_DSN
y la apuntó a MailCatcher. ¿Qué... es MailCatcher?
Para averiguarlo, ejecuta:
symfony open:local:webmail
¡Genial! MailCatcher es un servicio de correo electrónico falso con una pequeña GUI web para ver los correos que ha enviado tu aplicación. Si enviáramos un correo electrónico a través de nuestra aplicación real, aparecería aquí.
Observa. Ejecuta:
symfony console app:lockdown:start
¡Cierre! Y cuando compruebes MailCatcher... ¡ja! ¡Tenemos dos mensajes! ¡Qué guay!
Utilizando zenstruck/mailer-test
De todas formas, antes de que dejemos de hablar de correos electrónicos, quiero mostrarte una herramienta más. Y es otra biblioteca de Zenstruck. Ejecuta:
composer require zenstruck/mailer-test --dev
Symfony tiene herramientas integradas para probar correos electrónicos, y funcionan muy bien. Esta biblioteca de mailer-test
nos da aún más herramientas, ¡y es fácil de usar!
Añade otro rasgo a nuestra prueba - use InteractsWithMailer
- y luego, aquí abajo, en lugar de assertEmailCount
, podemos decir $this->mailer()->
... y entonces, woh, tenemos un montón de asertos diferentes a nuestra disposición. Di->assertSentEmailCount(1)
, y debajo, assertEmailSentTo()
constaff@dinotopia.com
y la línea de asunto PARK LOCKDOWN
. ¡Uy! Deja que corrija mi errata. Puedes ver que esto es el expectedTo
y luego esto es un callable
donde podríamos afirmar más cosas o simplemente pasar el asunto esperado.
// ... lines 1 - 11 | |
use Zenstruck\Mailer\Test\InteractsWithMailer; | |
// ... line 13 | |
class LockDownHelperTest extends KernelTestCase | |
{ | |
// ... line 16 | |
use InteractsWithMailer; | |
// ... lines 18 - 35 | |
public function testDinoEscapedPersistsLockDown() | |
{ | |
// ... lines 38 - 41 | |
$this->mailer()->assertSentEmailCount(1); | |
$this->mailer()->assertEmailSentTo('staff@dinotopia.com', 'PARK LOCKDOWN'); | |
} | |
// ... lines 45 - 49 | |
} |
Esto es bastante sencillo, pero es una de las muchas cosas que podemos hacer con esta biblioteca. Consulta la documentación para enterarte de todo.
Ejecuta de nuevo la prueba:
symfony php vendor/bin/phpunit tests/Integration/Service/LockDownHelperTest.php
¡Todo bien! A continuación: hablemos de las pruebas con Messenger.