代码之家  ›  专栏  ›  技术社区  ›  geoB

在功能测试中返回Symfony Mailer邮件的正文?

  •  0
  • geoB  · 技术社区  · 5 年前

    $email = $this->getMailerMessage(0);
    $body = $email->getBody();
    var_dump($body);
    

    $body 显示为

    对象(Symfony\Component\Mime\Part\Multipart\AlternativePart)。。。

    该对象没有(明显的)可访问属性。在功能测试中,是否有任何方法可以访问Symfony Mailer发送的电子邮件正文的文本?

    $mailCollector = $this->client->getProfile()->getCollector('swiftmailer');
    $collectedMessages = $mailCollector->getMessages();
    $message = $collectedMessages[0];
    $body = $message->getBody();
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   geoB    5 年前

    assertEmailHeaderSame 寻找 assertEmailHtmlBodyContains 然后 class EmailHtmlBodyContains 哪个有 $message->getHtmlBody() .

    $body = $email->getHtmlBody(); ,这是一个字符串。可以解析。

        2
  •  0
  •   Andrey Mashukov    5 年前

    $this->mailer = $this->createMock(\Swift_Mailer::class);
    
    self::$container->set('swiftmailer.mailer.default', $this->mailer);
    

    在当前测试中为消息定义数组变量之后

    /** @var null|\Swift_Message $emailMessage */
    $emailMessages = [];
    
    $this->mailer
        ->method('send')
        ->willReturnCallback(function (\Swift_Message $message) use (&$emailMessages) {
            $emailMessages[] = $message;
        });
    

    因此,我们会将每封邮件捕获到$emailMessages,您只需选择所需的邮件并声明其内容,如:

    $emailMessage = $emailMessages[0] ?? null;
    
    $this->assertNotNull($emailMessage);
    $this->assertInstanceOf(\Swift_Message::class, $emailMessage);
    
    $body     = $emailMessage->getBody();
    $expected = \file_get_contents(__DIR__ . '/../data/RestController/ServiceController/you_message_body.html');
    // do not forget to replace dynamic data in the snapshot.
    $body     = \preg_replace('/cid:[a-z0-9]{32}/ui', 'cid_here', $body);
    $this->assertEquals($expected, $body);
    
        3
  •  0
  •   Andrey Mashukov    5 年前
    1. 创建服务_测试.yaml靠近你的服务.yaml
    services:
        # default configuration for services in *this* file
        _defaults:
            autowire: true      # Automatically injects dependencies in your services.
            autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
            public: true
    
        test.mailer_symfony: '@Symfony\Component\Mailer\MailerInterface'
    
    use Symfony\Component\Mailer\MailerInterface;
    
    // setUp() 
    
    $this->mailer = $this->createMock(MailerInterface::class);
    
    self::$container->set('test.mailer_symfony', $this->mailer);
    
    1. 测试中的Mock方法send(),根据以下代码 https://github.com/symfony/mailer/blob/5.x/MailerInterface.php
    use use Symfony\Component\Mime\RawMessage;
    
    // ....
    
    /** @var RawMessage[] $emailMessages */
    $emailMessages = [];
    
    $this->mailer
        ->method('send')
        ->willReturnCallback(function (RawMessage $message, Envelope $envelope = null) use (&$emailMessages) {
            $emailMessages[] = $message;
        });
    

    仅此而已,您可以在测试结束时断言$emailMessages,因此,您还可以添加 expects 并检查调用量 send() 方法

    推荐文章