LoginSignup
0
0

More than 3 years have passed since last update.

BCC を設定した Cake\Mailer\Mailer をテストすると実際にメールが送信されてしまう件

Posted at

問題

Cake\Mailer\Mailer で BCC を設定すると、EmailAssertTrait を使用したユニットテストで実際にメールが送信されてしまう場合があったりする :weary:

<?php
namespace App\Mailer;

use Cake\Mailer\Mailer;

class UserMailer extends Mailer
{
    public function welcom($user): void
    {
        $this
            ->setTo($user->email)
            ->setBcc('bcc@example.com') // <- これ
            ->setSubject('Reset password')
            ->setTemplate('welcom_mail', 'custom');
    }
}

とりあえずの対応

Cake\Mailer\Mailer::setBcc をスタブ化する

<?php
namespace App\Test\TestCase\Mailer;

use App\Mailer\UserMailer;
use Cake\Mailer\Email;
use Cake\Mailer\Transport\DebugTransport;
use Cake\TestSuite\EmailAssertTrait;
use Cake\TestSuite\TestCase;

class UserMailerTest extends TestCase
{
    use EmailAssertTrait {
        EmailAssertTrait::getMockForMailer as getMock;
    }

    public function setUp(): void
    {
        parent::setUp();
        Email::setConfigTransport('debug', ['className' => DebugTransport::class]);
    }

    public function tearDown(): void
    {
        parent::tearDown();
        Email::dropTransport('debug');
    }

    public function getMockForMailer($className, array $methods = [])
    {
        // BCC を設定すると実際にメールが送信されてしまうため、Cake\Mailer\Mailer::setBcc をスタブ化する
        if (!in_array('profile', $methods, true)) {
            $methods[] = 'setBcc';
        }

        $mailer = $this->createPartialMock($className, $methods);

        $mailer->expects($this->any())
            ->method('setBcc')
            ->willReturn($mailer);

        return $mailer;
    }

    public function testUserMailerWelcom(): void
    {
        $user = new \stdClass();
        $user->email = 'foo@example.com';

        $mailer = $this->getMockForMailer(UserMailer::class);
        $mailer->send('welcom', [$user]);

        $this->assertEmailTo($user->email);
    }
}

環境

  • CakePHP: 3.6.6

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0