7

在我的测试中,我调用了一些发送电子邮件的命令。我可以使用以下命令显示发送的电子邮件数量:

$output->writeln(
    $spool->flushQueue(
        $this->getContainer()->get('swiftmailer.transport.real')
    )
);

Symfony2 文档解释了如何在 Web 测试期间使用分析器获取电子邮件内容(在 Stack Overflow 上也有解释),但我不知道在没有 Web 请求时如何做同样的事情。

我使用了这些链接中提供的代码:

<?php

namespace ACME\MyBundle\Tests\Command;

use Liip\FunctionalTestBundle\Test\WebTestCase;

class EmailTest extends WebTestCase
{
    public function tesEmailCommand()
    {
        // load data fixtures

        // http://symfony.com/doc/current/cookbook/email/testing.html
        $client = static::createClient();
        // Enable the profiler for the next request (it does nothing if the profiler is not available)
        $client->enableProfiler();

        /** @var \Symfony\Bundle\FrameworkBundle\Console\Application $application */
        // inherit from the parent class
        $application = clone $this->application;

        $application->add(new EmailCommand());
        $command = $application->find('acme:emails');
        $commandTester = new CommandTester($command);

        $commandTester->execute(array(
            'command' => 'acme:emails'
        ));

        $display = $commandTester->getDisplay();

        $this->assertContains('foo', $display);

        // http://symfony.com/doc/current/cookbook/email/testing.html
        $mailCollector = $client->getProfile()->getCollector('swiftmailer');

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

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

        // Asserting email data
        $this->assertInstanceOf('Swift_Message', $message);
        $this->assertEquals(
            'You should see me from the profiler!',
            $message->getBody()
        );
    }
}

它返回此错误:

传递给 Symfony\Component\HttpKernel\Profiler\Profiler::loadProfileFromResponse() 的参数 1 必须是 Symfony\Component\HttpFoundation\Response 的实例,给定 null,在 .../vendor/symfony/symfony/src/Symfony/ 中调用Bundle/FrameworkBundle/Client.php 在第 72 行并定义 .../vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Profiler/Profiler.php:81 .../vendor/symfony/symfony/src/Symfony /Bundle/FrameworkBundle/Client.php:72 .../src/ACME/MyBundle/Tests/Command/EmailTest.php:94

错误来自这一行:

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

这似乎是合乎逻辑的,因为没有请求,所以没有响应。

我使用 Symfony 2.8.7。


这是我的 Swiftmailer 配置app/config_test.yml

swiftmailer:
    disable_delivery: true
    delivery_address: %swiftmailer.delivery_address%
4

6 回答 6

9

我已经能够使用它:

// kernel
$kernel = $this->createKernel();
$kernel->boot();

// container
$container = $kernel->getContainer();

// register swiftmailer logger
$mailer = $container->get('mailer');
$logger = new \Swift_Plugins_MessageLogger();
$mailer->registerPlugin($logger);

然后您可以通过以下方式获取消息内容:

foreach ($logger->getMessages() as $message) {
    $subject       = $message->getSubject();
    $plaintextBody = $message->getBody();
    $htmlBody      = $message->getChildren()[0]->getBody();
}
于 2016-10-16T09:34:58.903 回答
1

我没有找到解决方案,而是让我的命令更详细,以显示解释已完成操作的消息,间接告诉我电子邮件内容是什么。

于 2015-09-15T12:01:39.760 回答
1

您需要将插件注册到邮件程序中:

$mailer = static::$container->get('swiftmailer.mailer');
$logger = new \Swift_Plugins_MessageLogger();
$mailer->registerPlugin( $logger );

然后你可以循环所有发送的消息并检查你需要的数据,例如:

foreach ( $logger->getMessages() as $message ) {
    echo sprintf( '%s%s',$message->getSubject(), Chr(10) );
    echo sprintf( '%s%s',$message->getBody(), Chr(10) );
}

这里的关键是要记住,在 SwiftMail 库中,文件 MailTransport.php 调度事件“beforeSendPerformed”。此事件由 Swift_Plugins_MessageLogger 的实例 $logger 监听。该插件实现了 Swift_Events_SendListener 接口,其中方法之一是 getMessages,其中包含发送的消息的内容。你也可以在你的 symfony 功能测试中检查 swiftmail/swiftmailer 发送的消息数量。

于 2016-05-25T08:35:46.997 回答
-1

您可以像这样“伪造”请求,这可能会对您有所帮助。

$this->getContainer()->enterScope('request');
$request = Request::create('http://yourdomain.com'));
$this->getContainer()->set('request', $request, 'request');
$this->getContainer()->get('router')->getContext()->setHost('http://yourdomain.com');

我有一个功能,在我使用需要存在请求的服务的命令中执行类似的功能。

于 2015-07-28T20:29:37.537 回答
-1

您可以为 Monolog 添加自定义频道并将电子邮件内容发送到日志文件。

在 config.yml 添加

monolog:
    channels: ["mm"]
    handlers:
        mm:
            level:    debug
            type:     stream
            path:     "%kernel.logs_dir%/mm.log"
            channels: ["mm"]

然后在命令代码中使用:

$logger = $this->get('monolog.logger.mm');
$logger->info($emailContent);
于 2015-07-29T16:47:29.670 回答
-1

默认 SwiftmailerBundle 添加消息记录插件

$this->getContainer()
    ->get('swiftmailer.mailer.default.plugin.messagelogger')
    ->getMessages();

您可以在命令测试中使用它。

于 2016-02-01T16:13:37.767 回答