Как протестировать, было ли отправлено электронное письмо в функциональном тесте

Как протестировать, было ли отправлено электронное письмо в функциональном тесте

Отправка электронных писем в 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

Сборщик электронных писем доступен только тогда, когда профилировщик активирован и собирает информацию, как это объясняется в Как использовать профилировщик в функциональном тесте.

Проблема: Сборщик не содержит электронного письма

Если после отпраки письма было проведено перенаправление (например, когда вы отправляете письмо после обработки формы и до перенаправления на другую страницу), убедитесь в том, что тестовый клиет не последует за перенаправлением, как это объясняется в Тестирование. Иначе, сборщик будет содержать информацию страницы перенаправления и доступа к электронному письму не будет.