FrazeColder's avatar

Laravel Reset Password Notification does not get dispatched in test but does send an email

I am writing tests for my Laravel project. Right now I am testing the authentication code like login, logout, reset password and so on.

Sadly, my test is failing because there is no notification send. I have mocked the notifications but assertSendTo always fails with the reason The expected [Illuminate\Auth\Notifications\ResetPassword] notification was not sent..

However, when actual requesting a reset password email (not in the test, as a normal user on my website) I indeed do get an reset password email. So, it is functional and working but not in my test. How can this be? The .evn is also correct, I have set my mail host to mailtrap.io and I also receive this email... This is the best proof I can give you.

Here is my test:

use App\Models\User;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Str;
use Tests\TestCase;

class AuthTest extends TestCase
{
    /** @test */
    public function a_not_logged_in_user_can_request_a_new_password()
    {
        Notification::fake();

        $email = Str::random() . "@gmail.com";
        $current_password = Str::random(16);
        $current_password_hash = Hash::make($current_password);

        $user = User::factory()->create([
            'email' => $email,
            'password' => $current_password_hash
        ]);

        $response = $this->json('POST', route('password.email'), ['email' => $email]);

        $response->assertStatus(200);
        $response->assertLocation(route('home'));
        
        //$this->expectsNotification($user, ResetPassword::class);
        Notification::assertSentTo($user, ResetPassword::class);
    }
}

Any ideas why the test is not working or whats wrong with it? Whats also very strange is the fact that the response code 200 is indicating that everything succeeded without any problem.

This is the error I get when executing the test with assertSentTo

1) Tests\Feature\Auth\LoggedIn\ForgotPassword\AuthTest::a_not_logged_in_user_can_request_a_new_password
The expected [Illuminate\Auth\Notifications\ResetPassword] notification was not sent.
Failed asserting that false is true.

MyWebsiteProject/vendor/laravel/framework/src/Illuminate/Support/Testing/Fakes/NotificationFake.php:68
/MyWebsiteProject/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:261
MyWebsiteProject/tests/Feature/Auth/LoggedIn/ForgotPassword/AuthTest.php:35

And this is the error I get when executing it with expectsNotification

1) Tests\Feature\Auth\LoggedIn\ForgotPassword\AuthTest::a_logged_in_user_can_request_a_new_password
The following expected notification were not dispatched: [Illuminate\Auth\Notifications\ResetPassword]

MyWebsiteProject/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php:281
MyWebsiteProject/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:237
MyWebsiteProject/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:153

Kind regards and thank you!

0 likes
6 replies
FrazeColder's avatar

Also no, when testing it with assertQueued I also get an error that the Illuminate\Auth\Notifications\ResetPassword] is not queued

chaudigv's avatar

@frazecolder Check the import under ResetPassword file.

It should be use Illuminate\Notifications\Notification; and not use Illuminate\Support\Facades\Notification;

FrazeColder's avatar

Thats not working frr me.. I get Error: Call to undefined method Illuminate\Notifications\Notification::fake()

FrazeColder's avatar

Where do you want me to change the use? In my test or in the ResetPassword Class?

Please or to participate in this conversation.