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

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

мой исходный код такой же, как пример кулинарной книги,

контроллер :

public function sendEmailAction($name)
{
    $message = Swift_Message::newInstance()
        ->setSubject('Hello Email')
        ->setFrom('send@example.com')
        ->setTo('recipient@example.com')
        ->setBody('You should see me from the profiler!')
    ;

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

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

и тест :

// src/Acme/DemoBundle/Tests/Controller/MailControllerTest.php
use SymfonyBundleFrameworkBundleTestWebTestCase;

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('send@example.com', key($message->getFrom()));
        $this->assertEquals('recipient@example.com', key($message->getTo()));
        $this->assertEquals(
            'You should see me from the profiler!',
            $message->getBody()
        );
    }
}

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

PHP фатальная ошибка: вызов функции-члена getCollector () на не объект

проблема исходит из этой строки:

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

есть идеи ?

1 ответов


исключение выбрасывается, потому что getProfile() возвращает false, если профилировщик не включен. см.здесь.

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

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

далее enableProfiler()включает профилировщик только в том случае, если он зарегистрирован с включенным контейнером службы aka. см.здесь.

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

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

config_test.в формате YML

framework:
   profiler:
       enabled: true

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

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