进行单元测试时找不到“安全”类

时间:2020-04-06 12:44:20

标签: symfony phpunit

我正在发现使用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',
);

如果我没记错的话,它会重新生成项目中需要包含的所有类的列表。因此,这意味着不存在安全性吗?

0 个答案:

没有答案