代码之家  ›  专栏  ›  技术社区  ›  Finesse

如何使用“array”邮件驱动程序发送邮件?

  •  1
  • Finesse  · 技术社区  · 6 年前

    从5.7版开始,Laravel建议使用 array 测试期间邮件驱动程序:

    the documentation 跟这个司机没什么关系。根据 the source code ,驱动程序将所有消息存储在内存中,而不实际发送它们。如何在单元测试期间获取存储的“sent”消息(以便检查它们)?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Finesse    6 年前

    app()->make('swift.transport')->driver()->messages() . 返回值是 Swift_Mime_SimpleMessage

    完整PHPUnit测试示例:

    public function testEmail()
    {
        Mail::to('user@example.com')->send(new MyMail);
    
        $emails = app()->make('swift.transport')->driver()->messages();
        $this->assertCount(1, $emails);
        $this->assertEquals(['user@example.com'], array_keys($emails[0]->getTo()));
    }
    
        2
  •  2
  •   Maksim Ivanov    5 年前

    protected function assertMailSentTo($user, $expected = 1)
    {
        $messages = app('swift.transport')->messages();
    
        $filtered = $messages->filter(function ($message) use ($user) {
            return array_key_exists($user->email, $message->getTo());
        });
    
        $actual = $filtered->count();
    
        $this->assertTrue(
            $expected === $actual,
            "Sent {$actual} messages instead of {$expected}."
        );
    }
    
        3
  •  2
  •   Alan Reed    4 年前

    如果你有错误 Target class [swift.transport] does not exist

    $emails = app()->make('mailer')->getSwiftMailer()->getTransport()->messages();
    
    $count = $emails->count();
    $subject = $emails->first()->getSubject();
    $to = $emails->first()->getTo();
    $body = $emails->first()->getBody();