問題
Cake\Mailer\Mailer
で BCC を設定すると、EmailAssertTrait
を使用したユニットテストで実際にメールが送信されてしまう場合があったりする
<?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