如何测试 Laravel 内置的电子邮件验证通知?

4

我正在创建一个 Laravel 内置的电子邮件验证测试,但不确定如何通过 PHPUnit 进行测试。我能够使用 mailtrap.io 接收通知电子邮件,但无法使 PHPUnit 测试通过。

这是我的测试:

namespace Tests\Feature;

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

class RegistrationTest extends TestCase
{
    use RefreshDatabase;

    function test_a_confirmation_email_is_sent_on_registration()
    {
        Notification::fake();

        $user = create('App\User');

        Notification::assertSentTo($user, VerifyEmail::class);
    }
}

我想让“assertSentTo”通过。
现在我得到的是:

预期的通知[Illuminate\Auth\Notifications\VerifyEmail]未发送。断言失败,因为false不是true。 /home/jhiggins/projects/forum/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/NotificationFake.php:52 /home/jhiggins/projects/forum/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:237 /home/jhiggins/projects/forum/tests/Feature/RegistrationTest.php:20


3
不需要测试邮件是否发送,Laravel框架已经处理了这个问题,因为这是Laravel核心功能之一。你需要确保的是事件已被分派(你已经完成了这一步)。这就足以让你继续下一个功能了 ;) - Kenny Horna
我知道这是通过框架处理的,但难道还没有一种测试电子邮件是否已发送的方法吗? - James Higgins
确实可以测试自定义可邮寄对象通知,但在这种特定情况下,您想要测试Laravel框架功能,已经测试过了,因此重新测试是没有意义的。当然,您仍然可以手动执行此操作(如您试图执行的操作),但请确保在测试中实现注册流程。 - Kenny Horna
@HCK 感谢您的澄清,我明白了。 - James Higgins
我正在制作一个单页应用程序,需要重新制作身份验证结构。我会点赞这个问题,因为我想找到一种测试通知的方法,但即使我收到了电子邮件,它仍然无法通过测试。https://stackoverflow.com/questions/60888256/laravel-assert-email-verification-is-sent-with-mailfake-in-a-test - good_afternoon
@KennyHorna 测试注册事件是否被触发是不够的。因为我们可以在EventServiceProvider.php中简单地注释掉“SendEmailVerificationNotification :: class”,这样我们的功能测试就会通过,但这是不正确的。 - AmirRezaM75
1个回答

1
当一个新用户注册时,Laravel (5.7及以上版本)会派发一个Registered Event,所以我认为主要的重点是断言该事件已被调用。其余的工作(发送电子邮件验证等)已经由Laravel框架处理。
以下是我的功能测试片段:
public function a_confirmation_email_is_sent_upon_registration()
{
    Event::fake();

    $this->post(route('register'), [
        'name' => 'Joe',
        'email' => 'testemail@test.com',
        'password' => 'passwordtest',
        'password_confirmation' => 'passwordtest'
    ]);

    Event::assertDispatched(Registered::class);
}

这对我不起作用。我有完全相同的代码,但我得到了错误的断言:“未分派预期的[Illuminate\Auth\Events\Registered]事件。”事件(new Registered($user = $this->create($request->all())));正在执行。 - John Smith
Event::fake([Registered:class]) 对我有效。 - Sysix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接