Как протестировать, было ли отправлено электронное письмо в функциональном тесте
Как протестировать, было ли отправлено электронное письмо в функциональном тесте
Отправка электронных писем в Symfony достаточно прямолинейна, благодаря пакету SwiftmailerBundle, который использует силу библиотеки Swift Mailer.
Чтобы функционально протестировать, было ли отправлено письмо, и даже утвердить субъект письма, содержание или любые другие заголовки, вы можете использовать Профилировщик Symfony.
Начните с простого действия контроллера, которое отправляет электронное письмо:
1 2 3 4 5 6 7 8 9 10 11 12
public function sendEmail($name, \Swift_Mailer $mailer)
{
$message = (new \Swift_Message('Hello Email'))
->setFrom('send@example.com')
->setTo('recipient@example.com')
->setBody('You should see me from the profiler!')
;
$mailer->send($message);
return $this->render(...);
}
В вашем функциональном тесте, используйте сборщик swiftmailer
в профилировшике,
чтобы получить информацию о сообщениях, отправленных по предыдущему запросу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
// tests/Controller/MailControllerTest.php
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class MailControllerTest extends WebTestCase
{
public function testMailIsSentAndContentIsOk()
{
$client = static::createClient();
// Активирует профилировщик для следующего запроса (если профилировщик недоступен, то ничего не будет сделано)
$client->enableProfiler();
$crawler = $client->request('POST', '/path/to/above/action');
$mailCollector = $client->getProfile()->getCollector('swiftmailer');
// Проверяет, было ли отправено письмо
$this->assertSame(1, $mailCollector->getMessageCount());
$collectedMessages = $mailCollector->getMessages();
$message = $collectedMessages[0];
// Утверждение данных электронного письма
$this->assertInstanceOf('Swift_Message', $message);
$this->assertSame('Hello Email', $message->getSubject());
$this->assertSame('send@example.com', key($message->getFrom()));
$this->assertSame('recipient@example.com', key($message->getTo()));
$this->assertSame(
'You should see me from the profiler!',
$message->getBody()
);
}
}
Поиск и устранение неисправностей
Проблема: Объект сборщика - null
Сборщик электронных писем доступен только тогда, когда профилировщик активирован и собирает информацию, как это объясняется в Как использовать профилировщик в функциональном тесте.
Проблема: Сборщик не содержит электронного письма
Если после отпраки письма было проведено перенаправление (например, когда вы отправляете письмо после обработки формы и до перенаправления на другую страницу), убедитесь в том, что тестовый клиет не последует за перенаправлением, как это объясняется в Тестирование. Иначе, сборщик будет содержать информацию страницы перенаправления и доступа к электронному письму не будет.