测试没有控制器的电子邮件发送

时间:2015-10-02 08:52:20

标签: unit-testing symfony email swiftmailer

我的应用程序发送了许多电子邮件。官方文档通过HTTP客户端分析器告诉how to test emails sending

但是我发送的每封电子邮件显然都没有控制器。

如何测试不是从控制器触发的电子邮件? (我的意思是不是来自请求上下文)。

有关我具体案例的进一步详情

我正在使用一个监听器来触发对正在进行“电子邮件路由”的服务的调用 我想在这里做的是发送一些事件并检查发送的内容(电子邮件正文,标题,收件人......)

3 个答案:

答案 0 :(得分:2)

遵循此great post我扩展了Swift_MemorySpool

class CountableMemorySpool extends \Swift_MemorySpool implements \Countable
{
    public function count()
    {
        return count($this->messages);
    }

    public function getMessages()
    {
        return $this->messages;
    }
}

将其传递给我的服务使用的邮件程序

class MailServiceTest extends KernelTestCase
{
    protected $mailService;
    protected $spool;
// ...
    protected function setUp()
    {
        $this->spool = new CountableMemorySpool();
        $transport = new \Swift_Transport_SpoolTransport(
            new \Swift_Events_SimpleEventDispatcher(),
            $this->spool
        );
        $mailer = new \Swift_Mailer($transport);
        $this->mailService->setMailer($mailer);
    }

并经过测试

    // ...
    public function testMailSpec()
    {
        // ... Sending the mail ...
        $this->assertCount(1, $this->spool,
            'Expected exactly one email to be sent');
        $msg = $this->spool->getMessages()[0];
        $this->assertArrayHasKey('tartempion@test.com', $msg->getTo(),
            'Wrong recipient');
        $this->assertContains('Tartempion', $msg->getBody(),
            'Expected some string contained in the email body');
    }
}

答案 1 :(得分:1)

首先,您链接的文章是关于功能(e2e)测试,而不是单元。

其次,对于单元测试,你需要在你的Listener(发送电子邮件)中注入一些MailerMocker而不是真正的Mailer。

例如,你可以像这样创建一个简单的Mocker

class SwiftMailerTester extends \Swift_Mailer
{

    /**
     * @var array[\Swift_Mime_Message]
     *
     */

    protected $sentMessages = array ();

    /**
     * @var \Swift_Mime_Message
     */

    protected $lastSentMessage;

    public function __construct() {

    }
    /**
     * Mocks sending message
     *
     * @param \Swift_Mime_Message $message
     * @param null                $failedRecepients
     *
     * @return int
     */
    public function send(\Swift_Mime_Message $message, &$failedRecepients = null)
    {

        $this->lastSentMessage = $message;
        $this->sentMessages[] = $message;

        return 1;
    }

    /**
     * @return array[\Swift_Mime_Message]
     */
    public function getSentMessages()
    {
        return $this->sentMessages;
    }

    /**
     * @return \Swift_Mime_Message
     */

    public function getLastSentMessage()
    {
        return $this->lastSentMessage;
    }

    /**
     * @return int
     */
    public function getSentMessagesCount()
    {
        return count($this->sentMessages);
    }
}

然后在你的单元测试中访问lastSentMessage(或sentMessages)来分析Listener是否已经正常工作。

答案 2 :(得分:0)

您可能希望设置global request context,虽然文档是针对命令的,但应该有助于您的情况,除非您可以提供更具体的信息。