Тестовый сервис в Symfony с приватным методом - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь протестировать публичный метод в сервисе, но он вызывает другой приватный метод.

это тестовый класс

<?php

use App\Core\Application\Service\Files\UploadedFileService;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use App\Core\Infrastructure\FileStorage\Services\ImagePath;
use App\Core\Infrastructure\FileStorage\Services\ImageResizeGenerator;
use Symfony\Component\Routing\RouterInterface;

class UploadedFileServiceTest extends TestCase
{
    /** @var UploadedFileService */
    private $instance;

    private $parameterHandler;
    private $router;
    private $imageResizeGenerator;
    private $imagePath;

    public function setUp()
    {
        parent::setUp();

        $this->parameterHandler     = $this->prophesize(ParameterBagInterface::class);
        $this->router               = $this->prophesize(RouterInterface::class);
        $this->imageResizeGenerator = $this->prophesize(ImageResizeGenerator::class);
        $this->imagePath            = $this->prophesize(ImagePath::class);

        $this->instance = new UploadedFileService(
            $this->parameterHandler->reveal(),
            $this->router->reveal(),
            $this->imageResizeGenerator->reveal(),
            $this->imagePath->reveal()
        );
    }

    public function testGetDefaultImageResponse()
    {
        $result = $this->instance->getDefaultImageResponse('user');
    }

}

когда я запускаю testGetDefaultImageResponse test, в консоли появляется сообщение об ошибке.

это проверенная функция

/**
 * @param string $entity
 *
 * @return Response
 */
public function getDefaultImageResponse(string $entity)
{
    return new Response(
        $this->getDefaultImage($entity),
        Response::HTTP_OK,
        ['Content-type' => 'image/jpg']
    );
}

настоящая проблема в getDefaultImage() который выбрасывает ошибку

file_get_contents (): имя файла не может быть пустым

это содержание приватного метода

/**
 * @param string $entity
 *
 * @return bool|string
 */
private function getDefaultImage(string $entity)
{
    switch ($entity) {
        case 'entity1':
            return file_get_contents($this->parameterHandler->get('images.default_avatar'));
        case 'entity3':
            return file_get_contents($this->parameterHandler->get('images.default_logo'));
    }

    return file_get_contents($this->parameterHandler->get('images.default_avatar'));
}

как установить данные в $ this-> parameterHandler-> get ('images.default_avatar')

Где я ошибаюсь при запуске тестов? Я должен признать, что я новичок в юнит-тестах.

1 Ответ

0 голосов
/ 03 ноября 2018

Проблема заключается в том, что ваш тестовый макет, в данном случае ParameterHandler пророк, высмеивает метод get с поведением по умолчанию, возвращая ноль. Не было сказано, что делать при вызове метода, поэтому file_get_contents () не получит путь к файлу.

Прежде всего, вы должны сказать своему Пророку вернуть правильный путь к файлу:

    $this->parameterHandler = $this->prophesize(ParameterBagInterface::class);
    $this->parameterHandler->get('images.default_avatar')->willReturn('/your/path/avatar.jpg');

Теперь это скажет Пророку вернуть / your / path / avatar.jpg , если метод get () вызывается с параметром images.default_avatar . Это должно работать, если вы можете правильно настроить путь к аватару по умолчанию.

Вы могли бы даже сказать Пророку, что этот метод ДОЛЖЕН быть вызван, добавив -> shouldBeCalled () , но тогда вы бы протестировали внутреннюю часть вашего фактического протестированного класса (есть плюсы и минусы для этого типа тестирование и зависит от тестового примера):

    $this->parameterHandler->get('images.default_avatar')->willReturn('/your/path/avatar.jpg')->shouldBeCalled();

Следующая задача, вероятно, заключалась бы в том, чтобы абстрагировать вызов file_get_contents () в новый класс, который также можно смоделировать (например, по соображениям скорости и памяти).

...