gpt4 book ai didi

unit-testing - 如何使用 laravel Mailable 测试电子邮件的主题

转载 作者:行者123 更新时间:2023-12-03 23:38:13 24 4
gpt4 key购买 nike

我想知道,是否有一种简单直接的方法可以使用 Laravel 的新 Mailable 功能来测试电子邮件的主题

我有一个类可以发送 5 封不同的电子邮件,但它们都发送给同一个人,因此测试电子邮件是否发送给具体的人并不是真正的完整测试。我需要知道是否向具体的人发送了具体的电子邮件。

我认为,使用电子邮件的主题来测试唯一性是最好的方法。如果你有更好的方法请告诉我。

我有这个:

Mail::assertSentTo([Config::get('mail.backend')], SendEmail::class);



我想添加类似这样的东西

Mail::assertSubject('My Subject', SendEmail::class);



有没有办法做到这一点??

谢谢!

最佳答案

编辑
比我在 How to make assertions on a Laravel Mailable 找到的更快更好的解决方案,感谢@haakym
只需在断言之前调用 build() 方法:

Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
$mail->build();
return $mail->subject = 'The SUBJECT that I very much need';
});
无论如何我还是喜欢
Mail::assertSent(InfoRequestMailable::class, function ($mail) {
$mail->build();
$this->assertEquals(env('MOREINFO_MAILBOX'), $mail->to[0]['address'], 'The message wasn\'t send to the right email');
$this->assertEquals('Quite a subject', $mail->subject, 'The subject was not the right one');
return true;
});

我的原帖
我看到这个问题已经存在一段时间了,但我偶然发现了同样的事情。
( 重要的 :所有这些用于测试 单个邮件 )。
使用 Laravel 5.6
docs about mocking a Mail 中,您可以看到:
use Illuminate\Support\Facades\Mail;

class ExampleTest extends TestCase
{
public function testOrderShipping()
{
Mail::fake();

// Perform order shipping...

// 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('...');
});

}
}
这将减轻任何解决方案,对吗?您应该能够执行以下操作:

Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
return $mail->subject = 'The SUBJECT that I very much need';
});
这应该有效。正确的?好吧,除非你做一些不同的事情,否则它不会。
IMO 问题的根源
在Mail指南中,他们呈现的 every example使用了 build方法:
public function build()
{
return $this->from('example@example.com')
->subject('The SUBJECT that I very much need')
->view('emails.orders.shipped');
}
问题是,当您在方法的顶部调用 Mail::fake() 时,您将整个邮件系统变成了 Illuminate\Support\Testing\Fakes\MailFake(这就是为什么它支持 assertSent 方法等),这意味着自定义 build 函数永远不会被调用。
解决方案
您应该开始在 Mailable 类上使用更多的 __constructor 方法。只需在 build() 方法中返回实例:
(和修改) 之后 view example in the Mail guide :
namespace App\Mail;

use Illuminate\Mail\Mailable;

class OrderShipped extends Mailable
{
...

/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
$this->view('emails.orders.shipped');
$this->subject('The SUBJECT that I very much need');
}

/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this;
}
}

话虽如此,现在这有效:
Mail::fake();
...
Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
return $mail->subject == 'The SUBJECT that I very much need';
});
聚苯乙烯
我宁愿做这样的事情,因为我觉得控制更加精细:
class MailControllerTest extends oTestCase
{
public function testMoreInfo()
{
Mail::fake();

// send the mail

Mail::assertSent(InfoRequestMailable::class, function ($mail) {
$this->assertEquals(env('MOREINFO_MAILBOX'), $mail->to[0]['address'], 'The message wasn\'t send to the right email');
$this->assertEquals('Quite a subject', $mail->subject, 'The subject was not the right one');
return true;
});
}
}
assert 在单元测试中的工作方式永远不会出现错误的情况。 :)

关于unit-testing - 如何使用 laravel Mailable 测试电子邮件的主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42111644/

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