Тестовый сервис в Symfony с приватным методом
Я пытаюсь протестировать публичный метод в сервисе, но он вызывает другой приватный метод.
это тестовый класс
<?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
проверить, в консольном журнале ошибка apear.
это проверенная функция
/**
* @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 'user':
case 'ctestimonial':
return file_get_contents($this->parameterHandler->get('images.default_avatar'));
case 'company':
case 'partner':
case 'cslide':
case 'pslide':
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 ответ
Проблема в том, что ваш тестовый макет, в данном случае пророк 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() в новый класс, который также можно смоделировать (например, по соображениям скорости и памяти).