Laravel实施assertSentFrom特定地址可邮寄测试

Laravel implement assertSentFrom specific address Mailable Testing

试图掌握 Mocking 和测试用例,我想测试 Mailable TestMail 是从 company@company.com 发送的,文档提供了 hasTohasCchasBcc,但看起来不像是使用 hasFrom 之类的东西。有解决办法吗?

https://laravel.com/docs/9.x/mocking#mail-fake

public function testEmailAlwaysFrom()
{

    Mail::fake();

    Mail::to('foo@bar.com')->send(new TestMail);

    Mail::assertSent(TestMail::class, function ($mail) {
        return assertEquals('company@company.com', $mail->getFrom());
        // return $mail->hasTo($user->email) &&
        //     $mail->hasCc('...') &&
        //     $mail->hasBcc('...');
    });

}

MailFake 没有在 class 中提供 hasFrom 方法,因此 return false。

然而,当使用环境变量 MAIL_FROM_ADDRESS 时,下面的解决方法不起作用,必须在 build().

中调用 ->from()

已报告几个 GitHub 问题,建议采用以下解决方法:

https://github.com/laravel/framework/issues/20056 https://github.com/laravel/framework/issues/20059

public function testEmailAlwaysFrom()
{

    Mail::fake();

    Mail::to('foo@bar.com')
        ->send(new TestMail);

    Mail::assertSent(TestMail::class, function ($mail) {

        $mail->build(); // <-- workaround
    
        return $mail->hasTo('foo@bar.com') and
            $mail->hasFrom('company@company.com');
        
    });
        
}