无需调用控制器方法即可测试电子邮件发送功能

迪米特里奥斯·德西拉斯

当我查看这段symfony 的文档时,我意识到实际测试是在控制器上完成的。

就我而言,我要测试的是服务中的自定义函数,例如:

class MyMailService
{

 public function __construct(SwiftMailer $mailer)
 {
   $this->mailer=$mailer;
 }


 public function sendHelloEmail($from,$to)
 {
   $message = (new \Swift_Message('Hello Email'))
        ->setFrom($from)
        ->setTo($to)
        ->setBody('I can see stars');

    $this->mailer->send($message);
 }

}

那么如何在不需要调用客户端测试的情况下测试应用程序是否发送电子邮件?

迪米特里奥斯·德西拉斯

正如@BentCoder 建议的那样,您可以使用将邮件存储在 spool 目录中的方法并检查消息是否存在。为了识别使用自定义标题。就我而言,我只是在X-Agent标题中放置了一个通用名称

我的发送电子邮件服务代码是:

namespace AppBundle\Services;

use AppBundle\Interfaces\EmailSenderInterface;
use \Swift_Mailer;
use \Swift_Message;

class NormalEmailSend implements EmailSenderInterface
{

  /**
  * @var Swift_Mailer
  */
  private $mailer=null;

  public function __construct(Swift_Mailer $mailer)
  {
    $this->mailer=$mailer;
  }

  /**
  * @inheritdoc
  */
  public function send($from,$to,$title="",$bodyPlain="",$bodyHtml="",array $cc=[],array $bcc=[])
  {

    $message=new Swift_Message($title);
    $message->setFrom($from)->setTo($to)->setBody($bodyPlain,'text/plain');

    if($bodyHtml){
        $message->addPart($bodyHtml,'text/html');
    }

    $headers = $message->getHeaders();
    $headers->addTextHeader('X-Agent','ellakcy_member_app');

    return $this->mailer->send($message);
  }


}

测试是:

namespace Tests\AppBundle\Services;

use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use \Swift_Message;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\KernelInterface;

use AppBundle\Services\NormalEmailSend;

/**
* @testype functional
*/
class ContactEmailSendTest extends KernelTestCase
{

   /**
   * @var AppBundle\Services\NormalEmailSend
   */
   private $service;

   /**
   * @var String
   */
   private $spoolPath=null;

    /**
    * {@inheritDoc}
    */
     protected function setUp()
     {
         $kernel = self::bootKernel();
         $container = $kernel->getContainer();
         $this->service = $container->get(NormalEmailSend::class);
         $this->spoolPath = $container->getParameter('swiftmailer.spool.default.file.path');
     }

    public function testSendEmail()
    {
       $from='[email protected]';
       $to='[email protected]';
       $this->service->send($from,$to,'Hello','Hello','Hello');
       $this->checkEmail();
    }

    private function checkEmail()
    {
      $spoolDir = $this->getSpoolDir();
      $filesystem = new Filesystem();

      if ($filesystem->exists($spoolDir)) {
          $finder = new Finder();
          $finder->in($spoolDir)
                 ->ignoreDotFiles(true)
                ->files();

          if(!$finder->hasResults()){
            $this->fail('No email has been sent');
          }

          $counter=0;
          foreach ($finder as $file) {
              /** @var Swift_Message $message */
              $message = unserialize(file_get_contents($file));
              $header = $message->getHeaders()->get('X-Agent');
              $this->assertEquals($header->getValue(),'ellakcy_member_app');
              $counter++;
          }

          //@todo Possibly Consinder not doing this check
          if($counter===0){
              $this->fail('No email has been sent');
          }

      } else {
        $this->fail('On test environment the emails should be spooled and not actuallt be sent');
      }
    }


    /**
    * {@inheritDoc}
    */
    public function tearDown()
    {
        $spoolDir = $this->getSpoolDir();
        $filesystem = new Filesystem();
        $filesystem->remove($spoolDir);
    }

    /**
    * @return string
    */
    private function getSpoolDir()
    {
      return $this->spoolPath;
    }

}

希望它有所帮助,您也可以修改上面看到的代码,以便通过放置跟踪号码X-Mail-Id并将其作为可选参数放置在函数的发送参数上,以防号码不为空,您可以将其设置为标头。

因此,当您遍历假脱机目录时,您可以标记将通过其跟踪号发送的电子邮件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

电子邮件未在注册控制器中发送

来自分类Dev

从控制器发送电子邮件时延迟

来自分类Dev

迷你测试 - 无需渲染即可测试应用程序控制器方法

来自分类Dev

在移动应用程序上无需服务器即可在后台发送电子邮件

来自分类Dev

您如何在Shopware 6控制器中发送电子邮件?

来自分类Dev

从codeigniter控制器发送电子邮件后,无法在jquery中获得响应

来自分类Dev

验证电子邮件并将其发送到 Lumen 控制器

来自分类Dev

Rails控制器无法通过ActiveMailer传递测试中的电子邮件

来自分类Dev

电子邮件发送控制

来自分类Dev

MegaRaid控制器通知的电子邮件SMTP配置

来自分类Dev

AWS Lambda 无需验证即可发送电子邮件

来自分类Dev

symfony2功能测试电子邮件数据收集器messageCount 0但已发送电子邮件

来自分类Dev

symfony2功能测试电子邮件数据收集器messageCount 0但已发送电子邮件

来自分类Dev

发送确认电子邮件而不创建模型/控制器和使用数据库?

来自分类Dev

Symfony3-后台任务由控制器启动,完成后发送电子邮件

来自分类Dev

通过 gmail 发送电子邮件,无需其他邮件服务器,使用 postfix

来自分类Dev

从电子邮件中调用C#asp.net Web服务或Web方法,而无需打开浏览器

来自分类Dev

Firebase 功能电子邮件发送问题

来自分类Dev

无需将BCC与SparkPost API结合使用即可将单个电子邮件发送给多个收件人

来自分类Dev

通过电子邮件发送表单输入,无需服务器

来自分类Dev

即使邮件功能返回true,我的服务器也无法发送电子邮件

来自分类Dev

Firebase 云功能,无需 AUTH 即可发送邮件

来自分类Dev

通过控制器中的内存发送电子邮件并在Symfony2中的某些命令中后台打印

来自分类Dev

如何在电晕中用此代码调用发送电子邮件的功能?

来自分类Dev

如何在电晕中用此代码调用发送电子邮件的功能?

来自分类Dev

将控制器视图用于电子邮件视图CakePHP 2

来自分类Dev

使用gmail作为smpt从mvc控制器传递电子邮件

来自分类Dev

如何在Codeigniter 4控制器中使电子邮件字段为可选

来自分类Dev

UIActivityViewController在导航栏上显示电子邮件模式视图控制器

Related 相关文章

  1. 1

    电子邮件未在注册控制器中发送

  2. 2

    从控制器发送电子邮件时延迟

  3. 3

    迷你测试 - 无需渲染即可测试应用程序控制器方法

  4. 4

    在移动应用程序上无需服务器即可在后台发送电子邮件

  5. 5

    您如何在Shopware 6控制器中发送电子邮件?

  6. 6

    从codeigniter控制器发送电子邮件后,无法在jquery中获得响应

  7. 7

    验证电子邮件并将其发送到 Lumen 控制器

  8. 8

    Rails控制器无法通过ActiveMailer传递测试中的电子邮件

  9. 9

    电子邮件发送控制

  10. 10

    MegaRaid控制器通知的电子邮件SMTP配置

  11. 11

    AWS Lambda 无需验证即可发送电子邮件

  12. 12

    symfony2功能测试电子邮件数据收集器messageCount 0但已发送电子邮件

  13. 13

    symfony2功能测试电子邮件数据收集器messageCount 0但已发送电子邮件

  14. 14

    发送确认电子邮件而不创建模型/控制器和使用数据库?

  15. 15

    Symfony3-后台任务由控制器启动,完成后发送电子邮件

  16. 16

    通过 gmail 发送电子邮件,无需其他邮件服务器,使用 postfix

  17. 17

    从电子邮件中调用C#asp.net Web服务或Web方法,而无需打开浏览器

  18. 18

    Firebase 功能电子邮件发送问题

  19. 19

    无需将BCC与SparkPost API结合使用即可将单个电子邮件发送给多个收件人

  20. 20

    通过电子邮件发送表单输入,无需服务器

  21. 21

    即使邮件功能返回true,我的服务器也无法发送电子邮件

  22. 22

    Firebase 云功能,无需 AUTH 即可发送邮件

  23. 23

    通过控制器中的内存发送电子邮件并在Symfony2中的某些命令中后台打印

  24. 24

    如何在电晕中用此代码调用发送电子邮件的功能?

  25. 25

    如何在电晕中用此代码调用发送电子邮件的功能?

  26. 26

    将控制器视图用于电子邮件视图CakePHP 2

  27. 27

    使用gmail作为smpt从mvc控制器传递电子邮件

  28. 28

    如何在Codeigniter 4控制器中使电子邮件字段为可选

  29. 29

    UIActivityViewController在导航栏上显示电子邮件模式视图控制器

热门标签

归档