2013-06-24 5 views
7

Я пытаюсь проверить электронную почту в функциональном тесте ...Как проверить электронную почту в функциональном тесте (Symfony2)

Мой исходный код такой же, как example of the cookbook,

контроллер:

public function sendEmailAction($name) 
{ 
    $message = \Swift_Message::newInstance() 
     ->setSubject('Hello Email') 
     ->setFrom('[email protected]') 
     ->setTo('[email protected]') 
     ->setBody('You should see me from the profiler!') 
    ; 

    $this->get('mailer')->send($message); 

    return $this->render(...); 
} 

И тест:

// src/Acme/DemoBundle/Tests/Controller/MailControllerTest.php 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 

class MailControllerTest extends WebTestCase 
{ 
    public function testMailIsSentAndContentIsOk() 
    { 
     $client = static::createClient(); 

     // Enable the profiler for the next request (it does nothing if the profiler is not available) 
     $client->enableProfiler(); 

     $crawler = $client->request('POST', '/path/to/above/action'); 

     $mailCollector = $client->getProfile()->getCollector('swiftmailer'); 

     // Check that an e-mail was sent 
     $this->assertEquals(1, $mailCollector->getMessageCount()); 

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

     // Asserting e-mail data 
     $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() 
     ); 
    } 
} 

однако я получил эту ошибку:

PHP Fatal error: Call to a member function getCollector() on a non-object

Проблема возникает из этой линии:

любая идея?

+2

был мой ответ полезным? если да, пожалуйста, подтвердите/принимайте иначе, прокомментируйте, если что-то отсутствует или не работает :-) – nifr

+0

Я не могу проверить на время ... но не волнуйтесь, я держу ваше решение и попробую его на следующей неделе;) – Ousmane

ответ

7

Исключено, потому что getProfile() возвращает false, если профилировщик не включен. см. here.

public function getProfile() 
{ 
    if (!$this->kernel->getContainer()->has('profiler')) { 
     return false; 
    } 

    return $this->kernel->getContainer()->get('profiler')->loadProfileFromResponse($this->response); 
} 

Кроме enableProfiler() только позволяет профайлер, если он зарегистрирован в сервис-контейнер ака включен. см. here.

public function enableProfiler() 
{ 
    if ($this->kernel->getContainer()->has('profiler')) { 
     $this->profiler = true; 
    } 
} 

Теперь вы должны убедиться, что профайлер включен в тестовой среде. (Как правило, быть default setting)

config_test.yml

framework: 
    profiler: 
     enabled: true 

Вы можете добавить что-то вроде этого к тесту:

$this->assertEquals($this->kernel->getContainer()->has('profiler'), true); 
+0

Привет, @nifr, это действительно полезно для меня. thnx – kuldipem

+1

Примечание для читателей: вам необходимо отключить переадресацию, если вы хотите использовать профилировщик после отправки формы. '$ Client-> followRedirects (ложь); $ Client-> enableProfiler(); $ Client-> отправить ($ формы);/* использовать профайлер */if ($ profile = $ client-> getProfile()) {...}/* открыть целевую страницу */$ crawler = $ client-> request ('GET', $ client-> getResponse() - > headers-> Get ('место')); ' –