我想知道,如果有一种简单直接的方法可以使用Laravel的新Mailable函数测试电子邮件的主题
我有一个课程可以发送5个不同的电子邮件,但所有这些都发送给同一个人,因此测试是否将电子邮件发送给具体人员并不是一个完整的测试。我需要知道是否有具体的电子邮件发送给具体的人。
我认为,使用电子邮件主题来测试唯一性是最好的方法。如果你有更好的方法,请告诉我。
我有这个:
Mail :: assertSentTo([Config :: get(' mail.backend')],SendEmail :: class);
我想添加类似
的内容邮件:: 断言主题 ('我的主题',SendEmail :: class);
有办法吗?
谢谢!
答案 0 :(得分:1)
5.4
要执行您在问题中的测试,您可以这样做:
Mail::assertSent(SendEmail::class, function ($mail) {
return $mail->hasTo(Config::get('mail.backend'));
});
测试您可以执行以下操作的主题:
Mail::assertSent(SendEmail::class, function ($mail) {
return $mail->hasTo(Config::get('mail.backend'))
&& $mail->subject == 'My Subject';
});
https://laravel.com/docs/5.4/mocking#mail-fake
希望这有帮助!
答案 1 :(得分:0)
感谢@haakym
,该解决方案比How to make assertions on a Laravel Mailable中的我的(以下)解决方案更快,更好。只需在断言之前调用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;
});
我看到这个问题已经存在了一段时间,但我偶然发现了同样的问题。
重要这是用于测试一个邮件
在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';
});
,那应该可以。对?好吧,除非您做的事情有所不同,否则不会。
在邮件指南中,他们展示的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
方法的原因),这意味着永远不会调用acostume 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 TestCase
{
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
在单元测试中的工作方式永远不会出错。 :)
答案 2 :(得分:0)
注意:我的Laravel版本:6.x
您需要在声明主题之前调用build()
方法。在这里,我声明电子邮件已发送给已通过身份验证的用户,主题是付款存款通知
Mail::assertQueued(DepositePaymentMail::class, function ($mail) {
$mail->build();
return $mail->hasTo(auth()->user()->email) &&
$mail->subject == 'Payment Deposit Notification';
});
我的Mailable类的构建函数如下:
public function build()
{
return $this->subject('Payment Deposit Notification')
->markdown(
'email.company.deposite-payment-request'
);
}