【问题标题】:PhpUnit Test - Asserting variables and twig template contentPhpUnit 测试 - 断言变量和树枝模板内容
【发布时间】:2018-04-17 17:55:34
【问题描述】:

我已经根据本教程定义了一个简单的电子邮件控制器:

https://symfony.com/doc/3.4/email.html

所以php文件代码是:

<?php

namespace AppBundle\Controller;

use Symfony\Component\HttpKernel\Tests\Controller;


class SendEmailController extends Controller
{
    public function indexAction($originlEmail, $destinationEmail1, $destinationEmail2, $name, \Swift_Mailer $mailer)
    {
        $message = (new \Swift_Message('Email Title'))
            ->setFrom($originlEmail)
            ->setTo($destinationEmail1, $destinationEmail2)
            ->setBody(
                $this->renderView(
                    'emails/send-email.html.twig',
                    array('name' => $name)
                ),
                'text/html'
            );

        $mailer->send($message);

        return $this->render(...);
    }
}

.twig 模板代码是:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
</head>
<body>
    <h3>This is an email!</h3>
    <p>Hi {{ name }}, this is an email! </p>
</body>
</html>

现在,按照本教程 https://symfony.com/doc/3.4/email/testing.html 我创建了一个 PhpUnit 测试类:

<?php

namespace tests\AppBundle\Controller;

use AppBundle\Controller\SendMyEmailController;

class SendCustomerEmailControllerTest extends PHPUnit_Framework_TestCase
{
    public function testMailIsSentAndContentIsCorrect()
    {
        $client = static:: createClient();

        $client->enableProfiler();

        $crawler = $client->request('POST', 'path/to/above/action');

        $mailCollector = $client->getProfile()->getCollector('swiftmailer');

        $this->assertSame(1, $mailCollector->getMessageCount());

        $collectedMessages = $mailCollector->getMessages();
        $message = $collectedMessages[0];

        $this->assertInstanceOf('Swift_Message', $message);
        $this->assertSame('My Email Title', $message->getSubject());
        $this->assertSame($originEmail, key($message->getFrom()));
        $this->assertSame($destinationEmail1, $destinationEmail2, key($message->getTo()));
        ##Asserting template content???
        $this->assertSame(?????, $message->getBody()
        );
    }
}

那么,我遇到的问题是:

  1. 我应该在哪里以及如何定义(在测试中)变量,例如 $originEmail,因为在“assertSame...”行中,我收到错误“未定义的变量” $originEmail”。

  2. $this-&gt;assertSame($destinationEmail1, $destinationEmail2, key($message-&gt;getTo())); 行的语法(考虑到它们不止一个变量)是否正确?

  3. 如果不是在 .php 控制器中定义的文本,而是显示在 .twig 模板(在另外,通过使用像 {{ name }} 这样的变量?

【问题讨论】:

  • 请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。

标签: php symfony phpunit swiftmailer


【解决方案1】:

关于 1)

我将如何处理这取决于如何将此信息传递到操作中。如果它不是请求的一部分,我会通过执行以下操作来断言预期值:

$this->assertSame('expected@email.com', $message->getFrom());

如果它是路由的一部分,我会在测试中分配一个局部变量,然后将其传递给路由,可能是这样的:

$originalEmail = 'expected@email.com';
$path = sprintf('/path/to/action/%s', $originalEmail);
$client->request('POST', $path);
...
$this->assertSame($originalEmail, $message->getFrom());

如果它是 POST 数据的一部分:

$data = [
    'originalEmail' => 'expected@email.com',
];
$client->request('POST', '/path/to/action', $data);
...
$this->assertSame($data['originalEmail'], $message->getFrom());

关于 2)

这不会按预期工作,但您可以这样做(如果电子邮件是数组中的一个值):

$this->assertContains($destinationEmail1, $message->getTo());

或者如果它是一个键(就像在你的例子中一样):

$this->assertArrayHasKey($destinationEmail1, $message->getTo());

关于 3)

如果您想比较正文是否与示例匹配,您可能必须将参考输出存储在文件中,然后比较内容:

$this->assertSame(
    file_get_contents(__DIR__ . '/emails/reference_output.html'),
    $message->getBody()
);

在这种情况下,您必须小心您的电子邮件正文包含与您的参考输出相同的名称。

或者,您也可以使用 crawler 仅查找某些 html 元素及其内容,例如检查标题 &lt;h3&gt;This is an email!&lt;/h3&gt; 是否在那里:

$crawler = $client->request('POST', '/path/to/action');

$this->assertSame(
    'This is an email!',
    $crawler->filter('h3')->first()->text()
);
// alternative:
$this->assertGreaterThan(
    0,
    $crawler->filter('h3:contains("This is an email!")')->count()
);

【讨论】:

  • 作为后续:检查确切的电子邮件内容可能不是一个好主意。电子邮件的内容可能会发生变化,然后您的测试会中断,即使测试的行为实际上并没有中断。您可能只想检查模板中能够识别是否呈现了正确模板的部分,以使测试不那么脆弱(即仅在行为改变时中断)。
  • 对不起,但我不明白关于 1) (和 2)) 的可能性。我的目标是向 php 函数传递一个可以更改的电子邮件值(例如,通过从表单中获取该电子邮件地址)。这就是我引用变量而不是修复电子邮件值的原因。此外,关于 2) 的两个断言仍然得到“未定义变量”错误。
  • 如果您通过a form 传递数据,您可以使用GET 请求来“显示”表单,然后选择提交按钮并使用它来提交表单数据。只要我有时间,我会将其添加到我的答案中。我提供的链接应该已经为您提供了一个很好的尝试起点。
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 2012-07-27
  • 2013-09-09
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2011-11-11
  • 2011-05-17
相关资源
最近更新 更多