首页 > 解决方案 > Symfony 4, PHPUnit - 授权用户进行单元测试

问题描述

我正在编写测试来对控制器进行单元测试。我想检查我是否获得了正确的 url 内容,这需要用户登录。

我写了以下测试

class AdminControllerTest extends WebTestCase
{
    private $client = null;

    public function setUp()
    {
        $this->client = static::createClient();
    }

    public function testAdminHome(): void
    {
        $this->logIn();
        $crawler = $this->client->request('GET', '/admin/');

        $this->assertSame(Response::HTTP_OK, $this->client->getResponse()->getStatusCode());
        $this->assertGreaterThan(0, $crawler->filter('html:contains("Welcome to Admin Panel")')->count());
    }

    private function logIn()
    {
        $user = new User();
        $user->setId(1);
        $user->setEmail('test@admin.com');
        $user->setFullName('Admin User');
        $user->setEnabled(true);

        $session = $this->client->getContainer()->get('session');

        $firewallName = 'main';
        $firewallContext = 'main';

        $token = new UsernamePasswordToken($user, null, $firewallName, ['ROLE_ADMIN']);
        $session->set('_security_'.$firewallContext, serialize($token));
        $session->save();

        $cookie = new Cookie($session->getName(), $session->getId());
        $this->client->getCookieJar()->set($cookie);
    }
}

我的 security.yml 中的配置

security:
    encoders:
        App\Entity\User: auto

    providers:
        database_users:
            entity:
                class: App\Entity\User
                property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            pattern: ^/
            context: main

            form_login:
                check_path: security_login
                login_path: security_login
                csrf_token_generator: security.csrf.token_manager
                default_target_path: admin_home

            logout:
                path: security_logout
                target: security_login

    access_control:
         - { path: ^/admin, roles: [ROLE_ADMIN, ROLE_EDITOR] }
    role_hierarchy:
        ROLE_ADMIN: ROLE_EDITOR
        ROLE_EDITOR: ROLE_USER

然而,响应代码的断言返回我 200,但我登陆登录页面而不是管理员主页。也没有必需的内容,因为我在登录页面而不是管理员主页。

您能否检查代码并帮助我找出问题所在?

标签: symfonyphpunitsymfony4

解决方案


用户@isom 是对的,我应该让用户对象持久化,所以我使用固定装置让用户持久化,然后一切都很好。我没有创建新的用户对象,而是使用以下代码从数据库中提取它:

$user = self::$kernel->getContainer()->get('doctrine')->getRepository(User::class)->find(1);

推荐阅读