我正在发现使用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);
}
}
但是当我尝试测试时,我得到的是:
无法自动装配服务“ App \ Form \ CpomAf \ SearchProductType”:方法“ __construct()”的参数“ $ security”引用类“ 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));
}
}
我了解我的错误涉及我的表单类型文件,但是在服务中,我定位到链接到我的表单的唯一内容是 $ searchedData ,该数据是我提交表单后返回的数据(我还没有使用)。因此,我不确定为什么它要通过表单类型文件,为什么它不将安全性视为类。
在我的设置中,我尝试像这样使用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',
);
如果我没记错的话,它会重新生成项目中需要包含的所有类的列表。因此,这意味着不存在安全性吗?