Метод assertEmailIsQueued
Метод assertEmailIsQueued проверяет,
что письмо попало в очередь на отправку.
Он используется в тестах приложения вместе
с WebTestCase и профилировщиком.
Метод вешается на объект теста и принимает
первым параметром индекс письма в очереди.
Если письма с таким индексом нет или оно
не поставлено в очередь, тест падает.
Метод удобно применять, когда отправка
писем настроена через Messenger, а не
выполняется сразу. В этом случае письмо
не уходит моментально, а кладётся в
транспорт, и assertEmailIsQueued
подтверждает это поведение.
Синтаксис
assertEmailIsQueued(int $index = 0): void
Параметр $index задаёт порядковый
номер письма в очереди. Нумерация начинается
с нуля, поэтому первое письмо имеет индекс
0. Если параметр не указан,
проверяется первое письмо.
Пример
Давайте напишем тест, который проверяет, что после запроса письмо попало в очередь. Сначала создадим контроллер, отправляющий письмо:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMailerMailerInterface;
use SymfonyComponentMimeEmail;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(MailerInterface $mailer): Response
{
$email = (new Email())
->from('hello@example.com')
->to('user@example.com')
->subject('article')
->text('abcde');
$mailer->send($email);
return new Response('sent');
}
}
?>
Теперь напишем тест, который проверяет, что письмо поставлено в очередь:
<?php
namespace AppTestsController;
use SymfonyBundleFrameworkBundleTestWebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testEmailIsQueued(): void
{
$client = static::createClient();
$client->request('GET', '/article');
$this->assertEmailIsQueued(0);
}
}
?>
Результат выполнения теста:
php bin/phpunit tests/Controller/ArticleControllerTest.php
OK (1 test, 1 assertion)
Пример
Давайте проверим несколько писем сразу. Отправим два письма в одном запросе:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentMailerMailerInterface;
use SymfonyComponentMimeEmail;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'article_list')]
public function list(MailerInterface $mailer): Response
{
$first = (new Email())
->from('hello@example.com')
->to('user@example.com')
->subject('article 1')
->text('abcde');
$second = (new Email())
->from('hello@example.com')
->to('user@example.com')
->subject('article 2')
->text('abcde');
$mailer->send($first);
$mailer->send($second);
return new Response('sent');
}
}
?>
Теперь проверим каждое письмо по его индексу:
<?php
namespace AppTestsController;
use SymfonyBundleFrameworkBundleTestWebTestCase;
class ArticleControllerTest extends WebTestCase
{
public function testEmailsAreQueued(): void
{
$client = static::createClient();
$client->request('GET', '/articles');
$this->assertEmailIsQueued(0);
$this->assertEmailIsQueued(1);
}
}
?>
Результат выполнения теста:
php bin/phpunit tests/Controller/ArticleControllerTest.php
OK (1 test, 2 assertions)
Смотрите также
-
метод
assertEmailCount,
который проверяет количество отправленных писем -
метод
assertQueuedEmailCount,
который проверяет количество писем в очереди -
метод
assertEmailAddressContains,
который проверяет адрес получателя письма -
метод
createClient,
который создаёт клиент для выполнения запросов