Я открываю модульное тестирование с помощью phpunit и хочу проверить какой-то метод внутри моего сервиса.
Вот мой тестовый код, чтобы сделать это:
<?php
namespace App\Tests;
use App\Services\SortingDataSearchedProductService;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SearchedProductTest extends WebTestCase
{
private $sortingDataSearchedProductService;
public function setUp()
{
self::bootKernel();
$container = self::$container;
$this->sortingDataSearchedProductService = $container->get(SortingDataSearchedProductService::class);
}
public function testFindStatusLinkedToGrantedRoles() {
$grantedRolesList = [];
$this->sortingDataSearchedProductService->findStatusLinkedToGrantedRoles($grantedRolesList);
}
}
Но когда я попробую свой тест, вот что я получаю:
Невозможно подключить автосервис "Приложение \ Form \ CpomAf \ SearchProductType ": аргумент" $ security "метода" __construct () "ссылается на класс" Symfony \ Component \ Security \ Core \ Security ", но такой службы не существует.
Я думаю, Я получаю эту ошибку, потому что тестирование проходит через страницу, где находится функция, которую я хочу протестировать. Вот сервис, который я хочу протестировать:
<?php
namespace App\Services;
use App\Entity\Custom\SearchProduct;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
use App\Entity\User;
use Symfony\Component\Yaml\Yaml;
/**
* Class SortingDataSearchedProductService
* @package App\Services
*/
class SortingDataSearchedProductService
{
/**
* @var Security
*/
private $security;
/**
* SortingDataSearchedProductService constructor
* @param Security $security
*/
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* Form Data
* @param SearchProduct $searchedData
*
* @return array
*/
public function findDataOfSearchWithConditions(SearchProduct $searchedData): array
{
/** @var User $user */
$user = $this->security->getUser();
$userPermissions = $user->getPermissions();
return $this->findStatusLinkedToGrantedRoles(
$userPermissions
);
}
/**
* Get array of final list of granted roles
*
* @param array $userPermissions
* @return array
*/
public function findStatusLinkedToGrantedRoles(array $userPermissions): array
{
//Getting the list of role linked to status from yaml file
$permissionStatusList = Yaml::parseFile(dirname(__DIR__).'/../config/roles.yaml');
$arrayPermissionListStatus = $permissionStatusList[0];
//Declaration array status list
$statusList = [];
//Getting status linked to permissions
foreach ($userPermissions as $userPermission) {
if (array_key_exists($userPermission, $arrayPermissionListStatus)) {
foreach ($arrayPermissionListStatus[$userPermission] as $status) {
array_push($statusList, $status);
}
}
}
//Deleting double values
return array_values(array_unique($statusList));
}
}
Я понимаю, что моя ошибка относится к моему файлу формы, но в сервисе я нацеливаюсь только на то, что ссылается на мою форму: $ seekData которые эти данные вернули при отправке моей формы (которую я пока не использую). Следовательно, я не уверен, почему он просматривает мой файл типа формы и почему он не рассматривает безопасность как класс.
Я пытался использовать MockBuilder в своих настройках, но это не помогло. Может быть, я неправильно использую модульное тестирование?
$this->getMockBuilder('Symfony\Component\Security\Core\SecurityContextInterface')
->disableOriginalConstructor()
->getMock();
РЕДАКТИРОВАТЬ
Вот содержимое моего файла карты автозагрузки после того, как я выполнил команду автозагрузки дампа:
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Collator' => $vendorDir . '/symfony/intl/Resources/stubs/Collator.php',
'IntlDateFormatter' => $vendorDir . '/symfony/intl/Resources/stubs/IntlDateFormatter.php',
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'Locale' => $vendorDir . '/symfony/intl/Resources/stubs/Locale.php',
'NumberFormatter' => $vendorDir . '/symfony/intl/Resources/stubs/NumberFormatter.php',
'SqlFormatter' => $vendorDir . '/jdorn/sql-formatter/lib/SqlFormatter.php',
);
I, если помните правильно, он восстанавливает список всех классов, которые должны быть включены в проект. Значит, это безопасность?