Teste de notificações por email com Laravel
- Erick Giorgio
- 01 Jan 2023
Testando alguns pontos do código você vai se deparar com alguma Notificação por email, E para testar isso significa que não quero enviar notificações reais, só queria falsificá-las para garantir que as mensagens sejam enviadas em algum ponto de gatilho e também queria testar o conteúdo desse e-mail.
Vamos pegar o exemplo de caso de teste da documentação que envia uma notificação ao usuário sobre a remessa do pedido.
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
public function testOrderShipping()
{
Notification::fake();
// Perform order shipping...
Notification::assertSentTo(
$user,
OrderShipped::class,
function ($notification, $channels) use ($order) {
return $notification->order->id === $order->id;
}
);
}
}
Isso funciona bem, mas como podemos afirmar que o conteúdo do email está correto? Bem, isso não é mencionado na documentação, mas ainda podemos fazer isso, ainda podemos escrever os assets para testar o conteúdo do email.
<?php
namespace Tests\Feature;
use Tests\TestCase;
use App\Notifications\OrderShipped;
use Illuminate\Support\Facades\Notification;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
public function testOrderShipping()
{
Notification::fake();
// Perform order shipping...
Notification::assertSentTo(
$user,
OrderShipped::class,
function ($notification, $channels) use ($order, $user){
// retrive the mail content
$mailData = $notification->toMail($user)->toArray();
$this->assertEquals("Order #{$order->orderNumber} shipped", $mailData['subject']);
$this->assertEquals("Hello {$user->name}!", $mailData['greeting']);
$this->assertContains("Your order #{$order->orderNumber} has been shipped", $mailData['introLines']);
$this->assertEquals("View Order", $mailData['actionText']);
$this->assertEquals(route('orders.show', $order), $mailData['actionUrl']);
$this->assertContains("Thank You!", $mailData['outroLines']);
return $notification->order->id === $order->id;
}
);
}
}
Aqui você pode ver, dentro método (closure), que estamos recuperando o conteúdo do email usando a função toMail(), que nos fornece a representação de coleção de todo o conteúdo do email e, além disso, estamos convertendo-o no array, o que nos fornece diferentes elementos, como subject,, linhas de introdução, texto de ação, link de ação, outras linhas.
Usando o array, podemos escrever as asserções básicas baseadas em texto do phpunit para garantir nosso conteúdo do email.
Isso é ótimo! essa é a beleza do Laravel Framework, que fornece tudo de imediato, apenas às vezes você precisa procurar na documentação deles.
Coding;)