Рейтинг:0

Функциональный тест для электронных писем (тема и заголовок)

флаг bo

Вопрос: Как Drupal Functional Test (расширяющий BrowserTestBase) может проверить наличие определенного Mail-Subject и Mail-Body, определенных в hook_mail в пользовательском модуле?

Контекст:

У меня есть собственный модуль, который отправляет электронное письмо определенным людям в случае создания нового узла определенного пакета.

Для этого существует функциональный тест (BrowserTestbase) точно так же, как пользовательский модуль делает это для ядра:

https://api.drupal.org/api/drupal/core%21tests%21Drupal%21KernelTests%21Core%21Action%21EmailActionTest.php/function/EmailActionTest%3A%3AtestEmailAction/8.9.x

Этот тест зеленый. Тема и тело проверяются после

$captured_emails = $this->drupalGetMails(); 

$this->assertEqual($captured_emails[0]['params']['subject'],"Моя желаемая тема");

$this->assertEqual($captured_emails[0]["params"]["body"], "Мое желаемое тело");

НО настоящие письма, которые доставляются, не имеют темы и тела! Как это возможно? Я сделал ошибку в пользовательском модуле, когда хотел отправить электронное письмо:

$mailManager->mail('my_custom', $key, $recipient, $langcode, $params, $from_email);

Неправильное значение первого параметра. Например, модуль называется «my_awesome», а не «my_custom». В этом случае Drupal не будет вызывать реализацию hook_mail в my_awesome_mail, поэтому объект $message не будет заполнен темой и телом. Нареканий и исключений нет. Тест зеленый, почта пуста.

флаг fr
Ссылка в вашем посте — это тест ядра, а не функциональный тест, и он проверяет основной плагин EmailAction.Он не проверяет почту, которую вы отправляете себе через $mailManager->mail() с вашим собственным hook_mail(). Нам нужно увидеть ваш hook_mail() и полную тестовую функцию, чтобы помочь вам понять, почему ваш пользовательский модуль не включает тело или тему. Я подозреваю, что ваш hook_mail() неправильный - одна из обязательных вещей, которые вы должны сделать в hook_mail(), - это правильно установить тему и тело сообщения - недостаточно передать значения в $mailManager->mail().
флаг bo
Да, когда я писал, параметр модуля в mailmanager->mail был неправильным, и hook_mail не вызывался. Вот почему тест зеленый, но отправленное письмо не имеет ни тела, ни темы. Возникает вопрос: как я могу написать тест, который будет красным, потому что отсутствует предмет и тело? И еще более сложно: как я могу написать этот тест независимо от того, какой почтовый плагин auf установлен (по умолчанию drupal, smyfony-/swiftmail, sesmailer,…)?
флаг fr
Нет, тест зеленый, потому что тест проверяет EmailAction, а не ваш код вообще. По крайней мере, это то, что я понял из вашего поста. Вы все еще не показали тестовый код, который используете. Если вы хотите использовать тест ядра, скопируйте что-то вроде core/modules/user/tests/src/Kernel/UserMailNotifyTest.php и измените его для своего кода. Основная схема тестового кода: 1) настроить тестовую среду, 2) вызвать функцию, которая отправляет почту, 3) использовать $this-getMails() для восстановления всех отправленных писем из буфера, затем проверить детали сообщения ( с).
флаг bo
Итак, как можно протестировать hook_mail в значимом модуле cutom? Он также никогда не тестировался в ядре, не так ли?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.