7

テスト中に、メールを送信するいくつかのコマンドを呼び出します。次のコマンドを使用して、送信された電子メールの数を表示できます。

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

Symfony2 のドキュメントには、Web テスト中にプロファイラーを使用してメール コンテンツを取得する方法が説明されています(こちらのスタック オーバーフローでも説明されています) が、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/ で呼び出されます。 72 行目の Bundle/FrameworkBundle/Client.php および定義済み .../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

プラグインをメーラーに登録する必要があります。

$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 インターフェイスを実装します。メソッドの 1 つは、送信されたメッセージの内容を含む getMessages です。また、symfony の機能テストで送信されたメッセージの swiftmail/swiftmailer 数を確認することもできます。

于 2016-05-25T08:35:46.997 に答える
1

解決策が見つかりませんでした。代わりに、何が行われたかを説明するメッセージを表示するために、コマンドをより冗長にしました。これにより、電子メールの内容が間接的にわかります。

于 2015-09-15T12:01:39.760 に答える
-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 に答える