Я прочитал много сообщений об этом на stackoverflow. Но большинство методов бесполезны в Symfony 2.3. Поэтому я должен попытаться вручную войти в систему пользователя в тесте, чтобы выполнить некоторые действия в серверной части. Вот мой 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 }
Вот мой тест:
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');
}
И когда я запускаю этот тест, метод $person = $this->get(security.context)->getToken()->getUser();
не работает в контроллере тестирования. Скажем, если при вызове контроллера $person->getId();
у меня будет ошибка Call to a member function getId() on a non-object in...
.
Итак, можете ли вы указать, как правильно войти в систему в функциональном тесте в Symfony 2.3?
Спасибо!
EDIT_1: если я изменю Symfony/Component/Security/Http/Firewall/ContextListener.php
и прокомментирую одну строку:
if (null === $session || null === $token = $session->get('_security_'.$this->contextKey)) {
// $this->context->setToken(null);
return;
}
все тесты проходят без ошибок.
EDIT_2: это ссылка, которую я пытаюсь использовать: первый второй третий четвертый пятый шестой седьмой восьмой nineth
$session
? Я бы отлаживал эту строку, поскольку кажется, что все, что вам нужно сделать, это ввести туда токен. Также ваш вопрос в значительной степени обратный. На самом деле вы хотите знать, как вручную ввести пользователя в целях тестирования. И до сих пор вы не объяснили и не предоставили ссылку, почему ваш код должен вообще работать. Я думаю, вам следует сначала предоставить ссылку, которая сделает ваш вопрос более ясным и более легким для ответа. - person hakre   schedule 26.09.2013