2015-10-02 1 views
3

Мое приложение отправляет много писем. Официальный doc сообщает how to test emails sending с профилировщиком HTTP-клиента.Проверка отправки электронной почты без контроллера

Но я, очевидно, не имею Контроллер для каждого отправляемого мной письма.

Как я могу проверить свои электронные письма, которые не запускаются с контроллера? (Я имею в виду не из контекста запроса).


Более подробная информация о моем конкретном случае

Я использую слушателя, чтобы вызвать вызовы к службе, которая делает «Маршрутизация электронной почты»
Что я хотел бы сделать здесь, является пожаром некоторых событий и проверяет, что отправлено (тело электронной почты, название, получатели, ...)

ответ

2

После этого great post я продлил Swift_MemorySpool

class CountableMemorySpool extends \Swift_MemorySpool implements \Countable 
{ 
    public function count() 
    { 
     return count($this->messages); 
    } 

    public function getMessages() 
    { 
     return $this->messages; 
    } 
} 

передал его в почтовой программе, используемой моей службы

class MailServiceTest extends KernelTestCase 
{ 
    protected $mailService; 
    protected $spool; 
// ... 
    protected function setUp() 
    { 
     $this->spool = new CountableMemorySpool(); 
     $transport = new \Swift_Transport_SpoolTransport(
      new \Swift_Events_SimpleEventDispatcher(), 
      $this->spool 
     ); 
     $mailer = new \Swift_Mailer($transport); 
     $this->mailService->setMailer($mailer); 
    } 

и испытаны

// ... 
    public function testMailSpec() 
    { 
     // ... Sending the mail ... 
     $this->assertCount(1, $this->spool, 
      'Expected exactly one email to be sent'); 
     $msg = $this->spool->getMessages()[0]; 
     $this->assertArrayHasKey('[email protected]', $msg->getTo(), 
      'Wrong recipient'); 
     $this->assertContains('Tartempion', $msg->getBody(), 
      'Expected some string contained in the email body'); 
    } 
} 
0

Возможно, вы захотите изучить настройку global request context, которая, хотя документация предназначена для команд, должна помочь с вашей ситуацией если вы не можете обеспечить, sp информационная.

+0

Спасибо. Я добавил подробности о моем конкретном случае. Я бы хотел избежать любого контекста запроса, так как мои письма отправляются на 95% без. –

1

Прежде всего, статья, на которую вы ссылаетесь, касается функционального тестирования (e2e), а не устройства.

Во-вторых, для модульного тестирования вам необходимо ввести несколько MailerMocker в свой Listener (который отправляет электронные письма) вместо реального Mailer.

Например, вы можете создать простой насмешник, как этот

class SwiftMailerTester extends \Swift_Mailer 
{ 

    /** 
    * @var array[\Swift_Mime_Message] 
    * 
    */ 

    protected $sentMessages = array(); 

    /** 
    * @var \Swift_Mime_Message 
    */ 

    protected $lastSentMessage; 

    public function __construct() { 

    } 
    /** 
    * Mocks sending message 
    * 
    * @param \Swift_Mime_Message $message 
    * @param null    $failedRecepients 
    * 
    * @return int 
    */ 
    public function send(\Swift_Mime_Message $message, &$failedRecepients = null) 
    { 

     $this->lastSentMessage = $message; 
     $this->sentMessages[] = $message; 

     return 1; 
    } 

    /** 
    * @return array[\Swift_Mime_Message] 
    */ 
    public function getSentMessages() 
    { 
     return $this->sentMessages; 
    } 

    /** 
    * @return \Swift_Mime_Message 
    */ 

    public function getLastSentMessage() 
    { 
     return $this->lastSentMessage; 
    } 

    /** 
    * @return int 
    */ 
    public function getSentMessagesCount() 
    { 
     return count($this->sentMessages); 
    } 
} 

И тогда в вашем единичном lastSentMessage доступа тест (или sentMessages) для анализа, если Слушатель сделал это работать правильно.

+0

Спасибо, что это интересно. Я на самом деле работаю над техникой, основанной на расширении катушки памяти, которую я собираюсь дать в качестве ответа здесь. –

 Смежные вопросы

  • Нет связанных вопросов^_^