亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel Notification Mailable 在測試中不起作用

Laravel Notification Mailable 在測試中不起作用

PHP
揚帆大魚 2022-01-14 18:08:11
當通知被觸發時,我正在使用通知向所有用戶發送郵件。這在手動“瀏覽網站”使用中效果很好(向 ContactController 提交 POST),但在我的測試中,郵件門面聲稱沒有發送任何郵件??刂破鳎?lt;?phpnamespace App\Http\Controllers;use App\Notifications\ContactRequestNotification;use App\User;use Illuminate\Http\Request;use Notification;class ContactController extends Controller{    public function create(Request $request)    {        $validateData = $request->validate([            'name' => 'required',            'email' => 'required|email',            'message' => 'required'        ]);        Notification::send(User::all(), new ContactRequestNotification($validateData));        return $validateData;    }}通知:<?phpnamespace App\Notifications;use App\Mail\ContactMail;use Illuminate\Mail\Mailable;use Illuminate\Notifications\Notification;class ContactRequestNotification extends Notification{    /**     * @var array     */    private $contactData;    /**     * Create a new notification instance.     *     * @return void     */    public function __construct($contactData)    {        $this->contactData = $contactData;    }    /**     * Get the notification's delivery channels.     *     * @param mixed $notifiable     * @return array     */    public function via($notifiable)    {        return ['mail'];    }    /**     * Get the mail representation of the notification.     *     * @param mixed $notifiable     * @return Mailable     */    public function toMail($notifiable)    {        return (new ContactMail($this->contactData['name'], $this->contactData['email'], $this->contactData['message']))->to($notifiable->email);    }    /**     * Get the array representation of the notification.     *     * @param mixed $notifiable     * @return array     */    public function toArray($notifiable)    {        return $this->contactData;    }}在瀏覽器中執行相同的任務時,會向用戶發送一封郵件。關于我在這里缺少什么的任何提示?互聯網搜索顯示其他一些人遇到了這個問題,但都沒有找到解決方案(或者我無法執行正確的搜索)
查看完整描述

1 回答

?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

看起來MailChannel發送通知電子郵件的驅動程序沒有使用Mail外觀,這意味著Mail::fake不會影響它。相反,它直接調用該send方法,該方法又調用(郵件驅動程序)。MailablesendMailer

您可以將Mailable實例替換為MailFake(這是Mail::fake使用的)的實例,但它看起來MailFake不適合當$view是一個數組(這是MailChannel傳遞給 的內容Mailable)的情況。

幸運的是,Laravel 源代碼包含一個示例,說明他們如何測試在SendingMailNotificationsTest. 他們模擬MailerandMarkdown實例并檢查傳遞的參數。你可以做類似的事情:

use Mockery as m;

use Illuminate\Contracts\Mail\Mailable;

use Illuminate\Contracts\Mail\Mailer;

use Illuminate\Mail\Markdown;

use Illuminate\Mail\Message;


class ContactFormTest extends TestCase

{


    protected function tearDown(): void

    {

        parent::tearDown();

        m::close();

    }


    protected function setUp(): void

    {

        parent::setUp();


        $this->mailer = m::mock(Mailer::class);

        $this->markdown = m::mock(Markdown::class);

        $this->instance(Mailer::class, $this->mailer);

        $this->instance(Mailer::class, $this->markdown);

    }


    public function a_mail_is_send_when_the_contact_form_is_used()

    {

        $this->withExceptionHandling();


        $user = factory(User::class)->create();


        $this->markdown->shouldReceive('render')->once()->andReturn('htmlContent');


        $this->markdown->shouldReceive('renderText')->once()->andReturn('textContent');


        $data = [

            'name' => 'John Doe',

            'email' => '[email protected]',

            'message' => 'This is a test message'

        ];


        $notification = new ContactRequestNotification($data);


        $this->mailer->shouldReceive('send')->once()->with(

            ['html' => 'htmlContent', 'text' => 'textContent'],

            array_merge($notification->toMail($user)->toArray(), [

                '__laravel_notification' => get_class($notification),

                '__laravel_notification_queued' => false,

            ]),

            m::on(function ($closure) {

                $message = m::mock(Message::class);

                $message->shouldReceive('to')->once()->with([$user->email]);

                $closure($message);

                return true;

            })

        );



        $response = $this->post('/contact', $data);


        $response->assertStatus(200);


    }

}


就個人而言,我現在寧愿只toMail對類上的方法進行單元測試,ContactRequestNotification因為我認為上面的方法不是很漂亮。


查看完整回答
反對 回復 2022-01-14
  • 1 回答
  • 0 關注
  • 194 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號