Laravel 在 PHPUnit 测试期间断言多个电子邮件收件人

Jac*_*ero 1 php email phpunit laravel

我想测试在 PHPUnit 测试期间电子邮件是否已发送到多个地址。我怎样才能做到这一点?

Jac*_*ero 6

尽管Laravel 文档确实表明对象中hasTo()存在一个函数Mail

// Assert a message was sent to the given users...
Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
    return $mail->hasTo($user->email) &&
                   $mail->hasCc('...') &&
                   $mail->hasBcc('...');
});
Run Code Online (Sandbox Code Playgroud)

并不清楚是否可以断言已发送多个地址的邮件。该hasTo函数接受以下结构作为预期的断言:

[
    [
        'email' => 'johnny@appleseed.com',
        'name' => 'Johnny Appleseed'
    ],
    [
        'email' => 'jane@appleseed.com',
        'name' => 'Jane Appleseed'
    ],
]
Run Code Online (Sandbox Code Playgroud)

由于名称键是可选的,测试特定用户是否收到电子邮件的最简单方法如下所示:

Mail::fake();

$admins = User::where('administrator', true)->get()->map(function ($admin) {
    return ['email' => $admin->email];
})->toArray();

Mail::assertSent(MyMailable::class, function ($mail) use ($admins) {
    return $mail->hasTo($admins);
});
Run Code Online (Sandbox Code Playgroud)

如果您使用了默认的 Laravel User 模型,或者您的用户模型同时具有nameemail属性,您可以将您的用户作为集合传入

Mail::fake();

$admins = User::where('administrator', true)->get();

Mail::assertSent(MyMailable::class, function ($mail) use ($admins) {
    return $mail->hasTo($admins);
});
Run Code Online (Sandbox Code Playgroud)