Модульное тестирование электронной почты для сброса пароля Laravel - отправляемая почта не ставится в очередь - PullRequest
0 голосов
/ 17 мая 2018

Я использую аутентификацию, которая пришла с Laravel.Я тестирую страницу, на которой вы указали свою электронную почту, и когда вы нажмете кнопку «Отправить», на вашу электронную почту будет отправлено письмо для сброса пароля.

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

Произошел 1 сбой:

1) Ожидаемый [Illuminate \ Foundation \ Auth \ResetPassword] не удалось поставить в очередь.Не удалось подтвердить, что false - это правда.

Я следую этому коду:

https://github.com/JeffreyWay/council/blob/master/tests/Feature/Auth/RegisterUserTest.php

<?php

namespace Tests\Controllers\Unit;

use Tests\TestCase;
use Illuminate\Support\Facades\Mail;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ResetPasswordEmailTest extends TestCase
{

    use RefreshDatabase;


    public function setUp()
    {
        parent::setUp();

        Mail::fake();
    }


    /** @test */
    public function does_send_password_reset_email()
    {
        $user = factory('App\User')->create();

        $this->post(route('password.email'), ['email' => $user->email])

        Mail::assertQueued(ResetPassword::class);
    }

}

1 Ответ

0 голосов
/ 16 ноября 2018

Вы получили эту ошибку, потому что адрес электронной почты для сброса пароля - Notification, а не Mailable. Обратите внимание, что вы также должны сохранить поддельного пользователя, чтобы код сброса пароля мог найти его в базе данных. То, что сработало для меня, выглядит примерно так:

<?php

namespace Tests\Controllers\Unit;

use Tests\TestCase;
use Illuminate\Support\Facades\Notification;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ResetPasswordEmailTest extends TestCase
{
    use RefreshDatabase;

    public function setUp()
    {
        parent::setUp();
        Notification::fake();
    }

    /** @test */
    public function does_send_password_reset_email()
    {
        $user = factory('App\User')->create();
        $user->save();
        $this->post(route('password.email'), ['email' => $user->email])
        Notification::assertSentTo($user, ResetPassword::class);
    }
}

Вы также можете проверить содержимое письма, используя что-то вроде этого:

Notification::assertSentTo(
    $user,
    ResetPassword::class, 
    function($notification, $channels) use ($user) {
        $mail = $notification->toMail($user)->build();
        $expected_subject = "Here's your password reset";
        return $mail->subject === $expected_sub;
    }
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...