功能测试由于从电子邮件中提取的令牌损坏而失败

问题描述

在Symfony 5项目中,当从电子邮件中提取确认令牌时,用户注册的功能测试失败。 (由于SwiftMailer具有发送日志的功能,因此电子邮件是通过SwiftMailer完成的。)

该测试从填写带有用户名和电子邮件地址的表格开始。在保存时,将发送电子邮件。由于测试包含$this->client->followRedirects(false);,因此测试可以访问电子邮件的内容。从电子邮件中提取令牌时,它会包含其他字符。因此,当测试尝试$this->client->request('GET','/register/reset/' . $token);时,由于无效的注册数据,测试失败。

这是测试的一个版本:

    public function testReplacementEmail() {
        $this->client->clickLink('Staff');
        $this->client->clickLink('Replace');
        $this->client->followRedirects(false);
        $this->client->submitForm('Save',[
            'user[fname]' => 'Useless','user[sname]' => 'Garbage','user[email]' => 'ugar@bogus.info'
        ]);
        $mailCollector = $this->client->getProfile()->getCollector('swiftmailer');

        $this->assertSame(1,$mailCollector->getMessageCount());
        $collectedMessages = $mailCollector->getMessages();
        $message = $collectedMessages[0];
        $this->assertStringContainsString('has been asked to designate',$message);

        $string = 'register/reset/';
        $offset = strlen($string);
        $pos = strpos($message,$string) + $offset;
        $token = substr($message,$pos,32);
        var_dump($token);

        $this->client->followRedirects(true);
        $this->client->request('GET','/logout');
        $this->client->request('GET','/register/reset/' . $token);
        $this->client->submitForm('Save',[
            'new_password[plainPassword][first]' => '123Abc','new_password[plainPassword][second]' => '123Abc',]);

        $this->assertStringContainsString('You are now the registered representative',$this->client->getResponse()->getContent());
    }

我已经在处理Replace的控制器中包含了链接$token = md5(uniqid(rand(),true));var_dump($token);的行,以便获得纯净的令牌。运行测试时,这些行将产生如下内容:

string(32) "ad47260162194f9ab6deb55eb4f38178"

如果我在测试中使用var_dump($message);访问电子邮件的内容,我会看到类似以下内容:

href="http://localhost/register/reset/ad47260162194f9ab6deb55eb4f38178"

但是测试包含var_dump($token);的地方,我却看到了这样的内容:

string(32) "7260162194f9ab6d=
eb55eb4f38178"

=\r\n(在Windows系统上)的存在会导致链接失败。

我想知道为什么会出现这些多余的字符,以及如何尽可能避免它们。

解决方法

字符串中=\r\n的存在表明该邮件已用quoted printable进行MIME编码,并且您的链接跨越了行尾。 SwiftMailer消息对象似乎具有一种神奇的__toString()方法,该方法(奇怪的是,IMO)产生消息的 encoded 形式。如果您想要原始的原始消息字符串,则可以调用消息对象的getBody()方法,然后对结果进行strpos()测试。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...