簡體   English   中英

PhpUnit測試-聲明變量和樹枝模板內容

[英]PhpUnit Test - Asserting variables and twig template content

我根據本教程定義了一個簡單的電子郵件控制器:

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. 考慮到在“ assertSame ...”行中的事實,我應該在哪里以及如何定義(在測試中)諸如$ originEmail的變量 ,我會收到錯誤消息“未定義的變量$ originEmail”。

  2. 是正確的$this->assertSame($destinationEmail1, $destinationEmail2, key($message->getTo()));行的語法(考慮到它們是多個變量 $this->assertSame($destinationEmail1, $destinationEmail2, key($message->getTo()));

  3. 如果在.twig模板中顯示了正文內容(而不是在.php控制器中定義的文本)(另外,還使用了{{name}}這樣的變量,該如何聲明正文內容?

關於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()
);

在這種情況下,您必須小心,您的電子郵件正文包含與參考輸出相同的名稱。

另外,您也可以使用搜尋器來查找某些html元素及其內容,例如,檢查標題<h3>This is an email!</h3>是否在其中:

$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()
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM