-1

使用 Mailer,似乎无法在功能测试中检索电子邮件的正文。例如,与

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

$body被揭示为

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

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

使用 SwiftMailer,您可以在功能测试中检索电子邮件正文:

$mailCollector = $this->client->getProfile()->getCollector('swiftmailer');
$collectedMessages = $mailCollector->getMessages();
$message = $collectedMessages[0];
$body = $message->getBody();
4

3 回答 3

1

找了好久才找到这个。回溯到然后assertEmailHeaderSame找到了。assertEmailHtmlBodyContainsclass EmailHtmlBodyContains$message->getHtmlBody()

所以现在我的测试包括$body = $email->getHtmlBody();,这是一个字符串。哪个可以解析。

于 2020-12-31T21:43:02.113 回答
0

那么,让我们开始吧。首先在您的测试中创建您服务的 MOCK,如下所示:

$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);
于 2021-01-01T14:01:15.167 回答
0
  1. 在您的 services.yaml 附近创建 services_test.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'
  1. 在 setup 方法中模拟真实服务并在服务容器中进行更改
use Symfony\Component\Mailer\MailerInterface;

// setUp() 

$this->mailer = $this->createMock(MailerInterface::class);

self::$container->set('test.mailer_symfony', $this->mailer);
  1. 根据此代码https://github.com/symfony/mailer/blob/5.x/MailerInterface.php在您的测试中模拟方法 send()应该类似于:
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()

于 2021-01-02T20:17:30.727 回答