Задать вопрос

Как протестировать метод контроллера в Symfony5?

Всем привет.
Может сталкивался кто с такой проблемой (а может и не проблемой вовсе): работа экшна контроллера завершается таким образом:

echo file_get_contents($path);
exit();


т.е. функция echo отдаёт изображение.

Протестить сие пытаюсь таким образом:

$crawler = self::$client->request('GET', $uri);

В результате в консоль сыпется куча символов (собственно само изображение отданное экшном через echo).

Можно ли вообще такое протестировать? Если да - то как?
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
glaphire
@glaphire
PHP developer
Раньше с таким не сталкивалась, но есть момент в описании вопроса - просто сделать эхо контента и exit не выйдет, чтобы вывести файл нужно еще добавить заголовки контента, размер файла и способ вывода. Т.е. в таком виде как метод контроллера есть сейчас я не понимаю, как он может корректно работать)
Даже если без доработок, то для предотвращения вывода контента файла в консоль достаточно использовать ob_start() и ob_get_clean().

Доработала пример:
Контроллер:
<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\Routing\Annotation\Route;

class TestController extends AbstractController
{
    /**
     * @Route("/get-image", name="get_image")
     */
    public function getImage()
    {
        $path = "/home/dariia/Code/sf5_http_kernel_course/public/uploads/article_image/lightspeed-5f687f2402b6f.png";

        $response = new BinaryFileResponse($path);

        return $response;
    }
}


Тест:
<?php

namespace App\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class TestControllerTest extends WebTestCase
{
    public function testRegister()
    {
        $client = static::createClient();
        ob_start();
        $client->request('GET', '/get-image');
        $client->getResponse()->sendContent();
        $this->assertResponseIsSuccessful();
        $this->assertResponseHeaderSame('Content-Type', 'image/png');
        ob_get_clean();
...

Дальше можно добавить ассерты на тему размера файла, имени и т.д., просто нужно иметь какую-то привязку к файлу, чтобы этими данными манипулировать, а я упростила пример)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы