Как проверить электронную почту в функциональном тесте (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);