我正试图断言用Laravel 5.4假货发送的邮件。
我的测试代码是:
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
被转储时,我得到以下内容:
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
数组中没有显示任何内容,这意味着当我断言Mail与hasTo()
一起发送时,它会失败:
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按如下方式存储用户:
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
mailable如下:
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');
}
}
现在让我更加奇怪的是,当我在应用程序上手动创建用户时,电子邮件将会到达!
有没有人知道为什么这不起作用?
答案 0 :(得分:1)
您应该将to
附加在可邮寄之外,就像在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");
}