Unit testing 在没有控制器的情况下测试电子邮件发送

Unit testing 在没有控制器的情况下测试电子邮件发送,unit-testing,symfony,email,swiftmailer,Unit Testing,Symfony,Email,Swiftmailer,我的应用程序发送了很多电子邮件。官方文档使用HTTP客户机档案器进行说明 但我显然没有一个控制器来控制我发送的每一封电子邮件 如何测试不是由控制器触发的电子邮件?(我的意思是不是从请求上下文) 关于我的具体案例的更多细节 我正在使用侦听器触发对正在执行“电子邮件路由”的服务的调用 我想在这里做的是,触发一些事件并检查发送的内容(电子邮件正文、标题、收件人等)您可能需要研究设置,尽管文档是用于命令的,但如果您不能提供进一步的、具体的信息,则应该对您的情况有所帮助。首先,您链接的文章是关于功能(e

我的应用程序发送了很多电子邮件。官方文档使用HTTP客户机档案器进行说明

但我显然没有一个控制器来控制我发送的每一封电子邮件

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


关于我的具体案例的更多细节

我正在使用侦听器触发对正在执行“电子邮件路由”的服务的调用

我想在这里做的是,触发一些事件并检查发送的内容(电子邮件正文、标题、收件人等)

您可能需要研究设置,尽管文档是用于命令的,但如果您不能提供进一步的、具体的信息,则应该对您的情况有所帮助。

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

其次,对于单元测试,您需要在侦听器(发送电子邮件)中插入一些MailerMocker,而不是真正的Mailer

例如,您可以创建这样一个简单的模拟程序

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),分析侦听器是否正确地完成了工作。

接下来,我扩展了
Swift\u 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');
    }
}

非常感谢。我已经补充了我的具体案例的细节。我想避免任何请求上下文,因为我的电子邮件发送95%没有上下文。谢谢,这很有趣。我正在研究一种基于内存假脱机扩展的技术,我将在这里给出一个答案。