Wie melde ich einen Benutzer in einer Sitzung innerhalb eines Funktionstests in Symfony 2.3 an?

Ich habe viele Posts über Stackoverflow darüber gelesen. Die meisten Methoden sind jedoch in Symfony 2.3 nicht hilfreich. Also habe ich versucht, Benutzer manuell im Test anzumelden, um einige Aktionen im Back-End durchzuführen. Hier ist meine security.yml

security:
...
  role_hierarchy:
        ROLE_SILVER: [ROLE_BRONZE]
        ROLE_GOLD: [ROLE_BRONZE, ROLE_SILVER]
        ROLE_PLATINUM: [ROLE_BRONZE, ROLE_SILVER, ROLE_GOLD]
        ROLE_ADMIN: [ROLE_BRONZE, ROLE_SILVER, ROLE_GOLD, ROLE_PLATINUM, ROLE_ALLOWED_TO_SWITCH]

    providers:
        database:
            entity: { class: Fox\PersonBundle\Entity\Person, property: username }

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        login:
            pattern:  ^/person/login$
            security: false

        main:
            pattern:    ^/
            provider:   database
            form_login:
                check_path: /person/login-check
                login_path: /person/login
                default_target_path: /person/view
                always_use_default_target_path: true
            logout:
                path:   /person/logout
                target: /
            anonymous: true

    access_control:
        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/person/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/person, roles: ROLE_BRONZE }

Hier ist mein Test:

class ProfileControllerTest extends WebTestCase
{
    public function setUp()
    {
        $kernel = self::getKernelClass();

        self::$kernel = new $kernel('dev', true);
        self::$kernel->boot();
    }

    public function testView()
    {
        $client = static::createClient();

        $person = self::$kernel->getContainer()->get('doctrine')->getRepository('FoxPersonBundle:Person')->findOneByUsername('master');

        $token = new UsernamePasswordToken($person, $person->getPassword(), 'main', $person->getRoles());

        self::$kernel->getContainer()->get('security.context')->setToken($token);

        self::$kernel->getContainer()->get('event_dispatcher')->dispatch(
        AuthenticationEvents::AUTHENTICATION_SUCCESS,
        new AuthenticationEvent($token));

        $crawler = $client->request('GET', '/person/view');
    }

Und wenn ich diesen Test durchführe,$person = $this->get(security.context)->getToken()->getUser(); Methode funktioniert nicht beim Testen des Controllers. Sagen Sie, wenn im Controller-Aufruf$person->getId(); Ich werde einen Fehler habenCall to a member function getId() on a non-object in... .

Können Sie also feststellen, wie Sie sich beim Funktionstest in Symfony 2.3 ordnungsgemäß als Benutzer anmelden können?

Vielen Dank!

EDIT_1: Wenn ich mich ändereSymfony/Component/Security/Http/Firewall/ContextListener.php und kommentiere einen String:

if (null === $session || null === $token = $session->get('_security_'.$this->contextKey)) {
            // $this->context->setToken(null);

            return;
        }

alle tests verliefen fehlerfrei.

EDIT_2: Dies ist eine Referenz, die ich verwenden möchte:zuerst zweite dritte vierte fünfte sechste siebte achte neunten

Antworten auf die Frage(2)

Ihre Antwort auf die Frage