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