实施发送联系邮件的单元测试

时间:2016-02-11 12:28:39

标签: symfony

我有一个联系人控制器,可以呈现我的联系表格并验证请求。验证成功后,联系控制器创建一个Contactobject并从ContactHandler调用方法proceedContact。现在我想为我的处理程序编写一个phpunit测试。这是我的第一次单元测试。我有以下问题。

  • 我应该测试我的控制器,还是只测试处理程序就足够了。?
  • 如何将服务注入我的Contacthandler?
  • 如何检查邮件是否成功发送电子邮件?
  • 这个用例存在类似的例子吗?

    namespace AppBundle\Utils;
    
    use AppBundle\Entity\Contact;
    
    class ContactHandler
    {
    private $mailer;
    private $templating;
    private $translator;
    private $emailTo;
    private $emailCc;
    
    public function __construct($mailer, $templating, $translator, $emailTo, $emailCc)
    {
        $this->mailer = $mailer;
        $this->templating = $templating;
        $this->translator = $translator;
        $this->emailTo = $emailTo;
        $this->emailCc = $emailCc;
    }
    
    public function proceedContact(Contact $contact)
    { 
        $subject_part_1 = $this->translator->trans('contact_mail_subject');
        $subject_part_2 = $this->translator->trans($contact->getRequest());
        $subject = $subject_part_1 . ' - ' . $subject_part_2;
    
        $message = \Swift_Message::newInstance()
            ->setSubject($subject)
            ->setFrom($contact->getEmail())
            ->setTo($this->emailTo)
            ->setCc($this->emailCc)
            ->setBody(
                $this->templating->render(
                'Emails/contact.html.twig',
                array('name' => $contact->getName(), 'message' => $contact->getMessage())
            ),
            'text/html'
        );
    
        $this->mailer->send($message);
    }
    
    
    }
    

1 个答案:

答案 0 :(得分:1)

这种逻辑(电子邮件发送)不应该在实体中完成。

您应该改为创建服务,或在相应的控制器中创建方法。

此外,当您的逻辑架构正常时,要在测试中处理服务容器,请参阅文档的the corresponding part

另见this very good article about using Dependency Injection in tests

并且,要从您的测试中发送电子邮件(在这种情况下功能比单位更多),请参阅E-mail testing

尝试使用此信息来构建测试,如果遇到困难,请在此处提出精确问题以解决确切问题。

相关问题