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

Отправка электронных писем в Symfony достаточно прямолинейна, благодаря пакету SwiftmailerBundle, который использует силу библиотеки Swift Mailer.

Чтобы функционально протестировать, было ли отправлено письмо, и даже утвердить субъект письма, содержание или любые другие заголовки, вы можете использовать Профилировщик Symfony.

Начните с простого действия контроллера, которое отправляет электронное письмо:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public function sendEmailAction($name, \Swift_Mailer $mailer)
{
    $message = new \Swift_Message('Hello Email')
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->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/AppBundle/Controller/MailControllerTest.php
namespace Tests\AppBundle\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->assertEquals(1, $mailCollector->getMessageCount());

        $collectedMessages = $mailCollector->getMessages();
        $message = $collectedMessages[0];

        // Утверждение данных электронного письма
        $this->assertInstanceOf('Swift_Message', $message);
        $this->assertEquals('Hello Email', $message->getSubject());
        $this->assertEquals('[email protected]', key($message->getFrom()));
        $this->assertEquals('[email protected]', key($message->getTo()));
        $this->assertEquals(
            'You should see me from the profiler!',
            $message->getBody()
        );
    }
}

Поиск и устранение неисправностей

Проблема: Объект сборщика - null

Сборщик электронных писем доступен только тогда, когда профилировщик активирован и собирает информацию, как это объясняется в How to Use the Profiler in a Functional Test.

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

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.