¿Cómo iniciar sesión en User in Session dentro de una prueba funcional en Symfony 2.3?
He leído muchas publicaciones en stackoverflow sobre esto. Pero la mayoría de los métodos no son útiles en Symfony 2.3. Así que he intentado iniciar sesión en el usuario manualmente en la prueba para realizar algunas acciones en el back-end. Aquí está mi 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 }
Aquí está mi prueba:
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');
}
Y cuando corro esta prueba,$person = $this->get(security.context)->getToken()->getUser();
El método no está funcionando en la prueba del controlador. Di si en la llamada del controlador$person->getId();
Tendré un errorCall to a member function getId() on a non-object in...
.
Entonces, ¿puede indicar la manera correcta de iniciar sesión en la prueba funcional en Symfony 2.3?
¡Gracias!
EDIT_1: Si me cambioSymfony/Component/Security/Http/Firewall/ContextListener.php
y comenta una cadena:
if (null === $session || null === $token = $session->get('_security_'.$this->contextKey)) {
// $this->context->setToken(null);
return;
}
Todas las pruebas se realizan sin errores.
EDITAR_2: Esta es una referencia que he tratado de usar:primero segundo tercero cuarto quinto sexto séptimo octavo noventa