gpt4 book ai didi

php - 如何对 Laravel Mailable 进行断言

转载 作者:行者123 更新时间:2023-12-05 04:07:45 25 4
gpt4 key购买 nike

在测试中,我想使用 Mail::assertSent() 对 Mailable 进行一些断言,如下所示:

Mail::assertSent(MyMailable::class, function ($mail) use ($user) {
return $mail->hasTo($user->email);
});

到目前为止,我已经找到了 hasTo()hasFrom()hasBcc() 和所有其他的 *() 方法非常有效。但是,当断言 Mailable 上的特定属性存在时,例如 subject 属性显示为 null 并且断言失败:

Mail::assertSent(MyMailable::class, function ($mail) {
return $mail->subject === 'My Subject';
});

我相信这是因为我已经在 build() 方法中配置了所有 Mailable 属性,在断言阶段可能还没有被调用,所以属性没有设置对象。

根据文档,我认为使用 build() 方法是正确的做法:

All of a mailable class' configuration is done in the build method. Within this method, you may call various methods such as from, subject, view, and attach to configure the email's presentation and delivery.

https://laravel.com/docs/5.5/mail#writing-mailables

我发现当我在构造函数上设置属性时,我可以获得对 Mailable 属性的断言:

class MyMail extends Mailable
{
public function __construct()
{
$this->subject = 'My Subject';
}

public function build() {
return $this->subject('My Subject')->view('emails/my-email')
}
}

但是,我觉得这种方法是错误的,因为我觉得我正在更改我的代码以适应我的测试。

所以,我想知道是否有更好的方法来对 Mailable 的属性进行断言?任何帮助将不胜感激,谢谢!

编辑 1

测试类(去掉无关代码)

/** @test */
function a_notification_is_sent_when_an_application_is_updated()
{
Mail::fake([RequiresVerification::class]);

// some set up and factory methods called here...

// the listener for this event sends mail
ApplicationUpdated::dispatch($application);

// this assertion passes
Mail::assertSent(RequiresVerification::class);

// this assertion does not pass when subject is set on the build()
// method but passes when subject is set on the constructor
Mail::assertSent(RequiresVerification::class, function ($mail) use ($user) {
return $mail->subject === 'hello';
});
}

编辑 2

我目前正在查看 hasRecipient() method ,所有 has* 方法都使用它,以查看它如何处理针对我假设的 Mailable 属性(收件人、发件人、密件抄送、抄送等)进行断言。也许可以使用类似的方法扩展 Mailable 对象以添加新的属性断言?

https://github.com/laravel/framework/blob/5.5/src/Illuminate/Mail/Mailable.php#L540

最佳答案

您可以通过在 assertSent 闭包中调用 build() 方法来对 build() 方法中配置的属性进行断言,然后再进行断言断言:

Mail::assertSent(MyMailable::class, function ($mail) {
$mail->build();
return $mail->subject === 'My Subject';
});

感谢@ohffs 在 laracasts 上的帮助:https://laracasts.com/discuss/channels/testing/how-to-make-assertions-on-a-laravel-mailable

关于php - 如何对 Laravel Mailable 进行断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com