Yii2 BaseMailer 测试环境不保存或发送

Yii2 BaseMailer test environment not saving or sending

我正在 运行 一些单元测试,其中一项测试检查电子邮件是否已生成和发送。

我已经检查了文档,强制 Yii 将电子邮件保存到文件而不是发送我已经配置 mailer 组件如下:

'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@common/mail',
        // send all mails to a file by default. You have to set
        // 'useFileTransport' to false and configure a transport
        // for the mailer to send real emails.
        'useFileTransport' => true
    ],

当 运行 测试时,我看到 Yii::info 消息来自 BaseMailer send() 函数。

[yii\mail\BaseMailer::send] 'Sending email "Direct Debit Payment Notification" to "test@test.co.uk"'

但是电子邮件没有保存到任何地方,应该是 runtime/mail,它也没有被发送到任何地方。

我尝试在运行时设置 useFileTransport 使用:

$mailer = Yii::$app->mailer;
$mailer->useFileTransport = true;
$mailer->composer... 

但没有任何变化,我们将不胜感激。

查看文档,yii\mail\BaseMailer::useFileTransport 如果启用,此选项会强制将邮件消息数据保存到本地文件中,而不是常规发送。这些文件将保存在yii\mail\BaseMailer::fileTransportPath下,默认情况下是@runtime/mail

因此请检查您的目录权限是否正常,您可以使用 fileTransportPath.

将其更改为您知道不会有权限问题的任何其他目录
'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'viewPath' => '@common/mail',
        // send all mails to a file by default. You have to set
        // 'useFileTransport' to false and configure a transport
        // for the mailer to send real emails.
        'useFileTransport' => true,
        'fileTransportPath'=>'your/path',
    ],

Codeception 会覆盖您的邮件程序设置([1] [2]) to use custom mailer,它不会发送或保存任何内容。这是有道理的 - 您不想在测试期间发送一堆电子邮件。

您可以使用 Codeception 自定义断言或方法来测试已发送的电子邮件:

$I->seeEmailIsSent(3); // Test that three emails was sent

$messages = $I->grabSentEmails();
$I->assertEquals('admin@site,com', $messages[0]->getTo());