MailThief —— 让 Laravel 应用中测试邮件发送变得简单

laravel-mailthief

MailThief 是 Tighten Co 编写的一个新扩展包,用于在 Laravel 应用中模拟邮件发送,通过该扩展包我们可以在不发送邮件的情况下实现邮件发送测试,这么说可能还是有点绕,下面我们通过一个具体的实例来说明。

假设我们之前为新用户注册成功发送欢迎邮件注册过一个这样的路由:

Route::post('register', function () {
    // <snip> 这里是注册实现逻辑 </snip>

    Mail::send('emails.welcome', [], function ($m) {
        $email = request('email');
        $m->to($email),
        $m->subject('Welcome to my app!');
        $m->from('noreply@example.com');
        $m->bcc('notifications@example.com');
    });

    // <snip> 返回响应 </snip>
});

通常这个功能测试很麻烦,需要我们手动注册,如果发送失败又要重新走一遍注册流程,但有了MailThief,一切都将变得简单:

首先,我们需要通过Composer安装该扩展:

composer require tightenco/mailthief

接下来我们通过如下Artisan命令创建测试类:

php artisan make:test RegistrationTest

然后修改测试类方法如下:

use MailThief\Facades\MailThief;

class RegistrationTest extends TestCase{
    public function testNewUserRegistered()
    {
        // 阻止和拦截向外发送邮件, 这一步很重要!
        MailThief::hijack();

        $this->post('register', [
            'name' => 'John Doe',
            'email' => 'john@example.com',
            'password' => 'secret',
        ]);
        // 检查邮件是否已发送到指定邮箱
        $this->assertTrue(MailThief::hasMessageFor('john@example.com'));

        // 也可以包含抄送邮箱
        $this->assertTrue(MailThief::hasMessageFor('notifications@example.com'));

        // 确保邮件主题正确
        $this->assertEquals('欢迎注册Laravel学院!', MailThief::lastMessage()->subject);

        // 确保这封邮件来自正确的发送地址
        // (`from` 可以是个列表,所以我们以集合形式返回)
        $this->assertEquals('noreply@example.com', MailThief::lastMessage()->from->first());
    }

}

然后在命令行运行 phpunit 命令,即可测试用户注册发送邮件功能。

学院君

学院君 has written 548 articles

资深PHP工程师,Laravel学院院长