Laravel 5.4断言发送的邮件不起作用

时间:2017-06-03 11:15:51

标签: php laravel unit-testing testing laravel-5

我正试图断言用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');
    }
}

现在让我更加奇怪的是,当我在应用程序上手动创建用户时,电子邮件将会到达! Email Arrives

有没有人知道为什么这不起作用?

1 个答案:

答案 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");
}