Teste de notificações por email com Laravel

Image Teste de notificações por email com Laravel

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;)