如何在单元测试Laravel中获取电子邮件验证链接

时间:2018-12-21 12:30:30

标签: laravel unit-testing phpunit

我正在开发Laravel应用程序。我正在对我的应用程序进行单元测试。现在,我在测试验证过程时遇到了麻烦。

我现在想要做的是注册一个用户,然后测试是否发送了验证电子邮件,然后我将获得该注册的验证链接,然后使用该链接进行操作。

  1. 第一个问题是未发送电子邮件。
  2. 第二个问题是我不知道如何检索 验证电子邮件链接?

这是我的考验

public function test_user_can_be_verified_and_redirected_based_on_role()
{
    Notification::fake();
    $user = $this->registerUser();
    Notification::assertSentTo($user, SendEmailVerificationNotification::class);

}

protected function registerUser()
{
    $user = factory(User::class)->make();

    $this->post(route('register'), [
        'name' => $user->name,
        'email' => $user->email,
        'password' => 'testing',
        'password_confirmation' => 'testing',
    ])->assertRedirect();

    return User::whereEmail($user->email)->first();
}

但是问题是即使我从浏览器注册时也不会发送通知。我还喜欢检索验证链接并执行某些操作。我该怎么办?

2 个答案:

答案 0 :(得分:0)

这不是一个完美的解决方案,但是可以解决问题,如果有人以某种方式破坏了此功能,我会知道的。 :)

首先覆盖 var calculateTotal = function(type) { var sum = 0; data.allItems[type].forEach(function(cur) { sum += cur.value; }) data.totals[type] = sum; } 通知的受保护方法verificationUri并将其公开

VerifyEmail

然后使用它来生成链接并对其进行断言。.

class EmailVerificationNotification extends VerifyEmail
{
    public function verificationUrl($notifiable) {
        return parent::verificationUrl($notifiable);
    }
}

答案 1 :(得分:0)

只需运行:

    $verificationUrl = URL::temporarySignedRoute(
        'verification.verify',
        now()->addMinutes(60),
        ['id' => $user->id, 'hash' => sha1($user->email)]
    );

无需公开 verificationUrl() 方法。