Laravel 5.4断言邮件发送不起作用 [英] Laravel 5.4 Assert Mail Sent Not Working

查看:62
本文介绍了Laravel 5.4断言邮件发送不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试确定使用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?

推荐答案

您应将to附加到可邮寄邮件的外部,就像在

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆