Laravel 5.4断言邮件发送不起作用 [英] Laravel 5.4 Assert Mail Sent Not Working
问题描述
我正在尝试确定使用Laravel 5.4假冒邮件发送的邮件.
I'm trying to assert mail sent with Laravel 5.4 fakes.
我的测试代码是这样:
public function setUp()
{
parent::setUp();
$this->admin = create(User::class, [
'is_admin' => true,
]);
$this->faker = Factory::create();
}
/** @test */
public function only_super_admin_can_create_admin()
{
$admin = [
'name' => $this->faker->name,
'email' => $this->faker->email,
];
Mail::fake();
$this->signIn($this->admin)
->post('/admins', $admin)
->assertRedirect('/admins');
Mail::assertSent(NewUser::class, function ($mail) use ($admin) {
dd($mail);
// return $mail->hasTo($admin['email']);
});
$this->assertDatabaseHas('users', $admin);
}
转储$mail
时,我得到以下信息:
When the $mail
is dumped I am getting the following:
App\Mail\NewUser {#722
#user: App\Models\User {#726
#fillable: array:6 [
0 => "name"
1 => "email"
2 => "password"
3 => "role"
4 => "is_admin"
5 => "id"
]
#hidden: array:2 [
0 => "password"
1 => "remember_token"
]
#connection: "testing"
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: true
#attributes: array:7 [
"name" => "Dave Ortiz"
"email" => "prosacco.dejuan@gmail.com"
"password" => "$2y$10$OGiQJJ/HCOIlbAl/t6tbpuz4WLQenLRVZgFPN/0e0P.3Ft9542OW2"
"is_admin" => true
"updated_at" => "2017-06-03 11:06:56"
"created_at" => "2017-06-03 11:06:56"
"id" => 2
]
#original: array:7 [
"name" => "Dave Ortiz"
"email" => "prosacco.dejuan@gmail.com"
"password" => "$2y$10$OGiQJJ/HCOIlbAl/t6tbpuz4WLQenLRVZgFPN/0e0P.3Ft9542OW2"
"is_admin" => true
"updated_at" => "2017-06-03 11:06:56"
"created_at" => "2017-06-03 11:06:56"
"id" => 2
]
#casts: []
#dates: []
#dateFormat: null
#appends: []
#events: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#visible: []
#guarded: array:1 [
0 => "*"
]
#rememberTokenName: "remember_token"
}
#password: "ogDt9X87fM"
+from: []
+to: []
+cc: []
+bcc: []
+replyTo: []
+subject: null
#markdown: null
+view: null
+textView: null
+viewData: []
+attachments: []
+rawAttachments: []
+callbacks: []
+connection: null
+queue: null
+delay: null
}
如您所见,它在to
数组中未显示任何内容,这意味着当我断言该邮件是通过hasTo()
发送的时,它会失败:
As you can see, it is showing nothing in the to
array which means when I assert that the Mail was sent with hasTo()
it fails:
1) Tests\Feature\SuperAdminTest::only_super_admin_can_create_admin
The expected [App\Mail\NewUser] mailable was not sent.
Failed asserting that false is true.
我的控制器按如下方式存储用户:
My Controller stores the user as follows:
public function store(StoreUserRequest $request)
{
$user = $request->storeUser(null, null, null, true);
return redirect('/admins');
}
StoreUserRequest
方法如下:
public function storeUser($name = null, $email = null, $password = null, $admin = false)
{
$password = $password ?: str_random(10);
$user = User::create([
'name' => ($name) ?: $this->name,
'email' => ($email) ?: $this->email,
'password' => bcrypt($password),
'is_admin' => $admin,
]);
Mail::send(new NewUser($user, $password));
return $user;
}
实际的NewUser
可邮寄地址如下:
The actual NewUser
mailable is as follows:
class NewUser extends Mailable
{
use Queueable, SerializesModels;
protected $user;
protected $password;
/**
* Create a new message instance.
*
* @param $user
* @param $password
*/
public function __construct($user, $password)
{
$this->user = $user;
$this->password = $password;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.users.' . strtolower(($this->user->is_admin) ? 'Admin' : 'Client'))
->with('user', $this->user)
->with('password', $this->password)
->to($this->user->email, $this->user->name)
->subject('[' . $this->user->name . '] Your New ' . ($this->user->is_admin ? 'Admin' : 'Client') . ' Account');
}
}
现在,使这种情况变得更奇怪的是,当我在应用程序上手动创建用户时,电子邮件将到达!
Now what makes this even more weird is when I manually create a user on the app, the email will arrive!
有人有什么想法为什么这行不通吗?
Does anyone have any ideas why this won't work?
推荐答案
You should attach to
outside of the mailable, just like in the documentation:
StoreUserRequest
Mail::to($user->email)->send(new NewUser($user, $password));
NewUser
public function build() {
$account_type = $this->user->is_admin ? 'Admin' : 'Client';
return $this->view('emails.users.' . strtolower($account_type)
->with([
'user' => $this->user,
'password' => $this->password
])
->subject("[${this->user->name}] Your New ${account_type} Account");
}
这篇关于Laravel 5.4断言邮件发送不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!