Электронная почта отправляемого уведомления не работает в модульном тесте Laravel - PullRequest
0 голосов
/ 17 января 2019

Я занимаюсь разработкой приложения Laravel.Я делаю юнит-тест.Но возникла небольшая проблема тестирования отправляемого электронного письма.

Мой тестовый код выглядит примерно так.

public function test_something()
{
    Mail::fake();

    //other test code

    Mail::assertSent(\App\Mail\ApplicationCreatedEmail::class, 1);
}

В реальной реализации.Я отправляю уведомление по электронной почте.Уведомление было отправлено в случае.

У меня есть такая модель для уведомления.

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable,
    //other code
}

Я отправляю уведомление в случае, как это.

class ApplicationCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $application;

    public function __construct($application)
    {
        $this->application = $application;
    }
}

Затем у меня есть прослушиватель для этого события, как этот.

class ApplicationCreatedListener
{
    public function handle(ApplicationCreated $event)
    {
        $event->application->user->notify(
            new ApplicationCreatedNotification($event->application)
        );
    }
}

Как вы можете видеть, в слушателе я отправляю уведомление (ApplicationCreatedNotification).Это определение ApplicationCreatedNotification.

class ApplicationCreatedNotification extends Notification
{
    use Queueable;
    public $application;


    public function __construct(Application $application)
    {
        $this->application = $application;
    }


    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return new ApplicationCreatedEmail($notifiable)->to($notifiable->email);
    }


    public function toArray($notifiable)
    {
        return [

        ];
    }
}

Как видите, уведомление отправляется как электронное письмо (Mailable).

Это мой почтовый класс (ApplicationCreatedEmail).

class ApplicationCreatedEmail extends Mailable implements ShouldQueue
{
    use SerializesModels, Queueable;

    public $application;

    public function __construct($application)
    {
        $this->application= $application;

        $this->subject('Application created');
    }


    public function build()
    {

        return $this->markdown('emails.application_created', []);
    }
}

Затем в коде я запускаю подобное событие в контроллере.

event(new ApplicationCreated($application));

Если вы вернетесь к тесту, как вы можете видеть, я пытаюсь проверить,электронная почта отправляется.Но это не удается, потому что электронное письмо не было отправлено.Но вместо этого, если я проверю, отправлено ли уведомление следующим образом.

public function test_something()
{
    Notification::fake();
    //other code
    Notification::assertSentTo($application->user, ApplicationCreatedNotification::class);
}

Это работает.Тестирование уведомлений работает.Проверка отправляемого сообщения не удалась.Но если я проверяю отправляемую электронную почту, класс электронной почты также запускается, потому что я зарегистрировал переменные с помощью помощника dd ().Он даже запускает функцию сборки mailable с любыми ошибками.Просто тест не пройден.В чем возможная ошибка?Как я могу это исправить?

...