簡體   English   中英

Symfony控制器功能測試中的$ this-> getUser()返回null

[英]$this->getUser() in Symfony controller functional test returns null

我正在嘗試測試使用$ this-> getUser()-> getUsername()的控制器。 它抱怨說getUsername()是在null上調用的。

這是我來自測試類的客戶登錄代碼

protected function logInAsAdmin(Client $client): void
    {
        $session = $client->getContainer()->get('session');

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

        $roles = [
            'ROLE_USER',
            'ROLE_ADMIN',
        ];

        $token = new UsernamePasswordToken('admin', null, $firewallName, $roles);
        $session->set('_security_' . $firewallContext, serialize($token));
        $session->save();

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

這是控制器的作用:

public function home(EmployerRepository $employerRepository, AuthorizationCheckerInterface $authorizationChecker): Response
    {
        if ($authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')) {
            $jobs = [];

            foreach ($employerRepository->findBy(['owner' => $this->getUser()->getUsername()]) as $employer) {
                $jobs = array_merge($jobs, $employer->getJobs()->toArray());
            }

            return $this->render('home.html.twig', ['jobs' => $jobs]);
        }

        return $this->redirectToRoute('login');
    }

誰能告訴我為什么這不起作用? 我嘗試實例化一個用戶對象,並將其傳遞給UsernamePasswordToken,但也沒有運氣。

使用Symfony 4。

考試:

/**
     * @test
     */
    public function indexPageIsRenderedWhenLoggedIn(): void
    {
        $client = static::createClient();
        $this->logInAsAdmin($client);
        $client->request('GET', '/');
        $this->assertEquals(200, $client->getResponse()->getStatusCode());
        $this->assertRegExp('/Your jobs/', $client->getResponse()->getContent());
    }

嘗試從logInAsAdmin函數返回$ client

protected function logInAsAdmin(Client $client): Client
{
    $session = $client->getContainer()->get('session');

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

    $roles = [
        'ROLE_USER',
        'ROLE_ADMIN',
    ];

    $token = new UsernamePasswordToken('admin', null, $firewallName, $roles);
    $session->set('_security_' . $firewallContext, serialize($token));
    $session->save();

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

並在測試中使用:

 /**
 * @test
 */
public function indexPageIsRenderedWhenLoggedIn(): void
{
    $client = static::createClient();
    $client = $this->logInAsAdmin($client);
    $client->request('GET', '/');
    $this->assertEquals(200, $client->getResponse()->getStatusCode());
    $this->assertRegExp('/Your jobs/', $client->getResponse()->getContent());
}

想讓所有人都知道我通過將TokenStorageInterface注入控制器中並通過$tokenStorage->getToken()->getUsername()獲取用戶名來解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM