Я занимаюсь разработкой приложения 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 с любыми ошибками.Просто тест не пройден.В чем возможная ошибка?Как я могу это исправить?