Я использую Behat в Symfony2 / Doctrine2. Теперь у меня есть сценарий, который сводится к тому, что «если я вошел в систему и захожу в / login, я должен перейти в / вместо»:
@login
Scenario: Go to the login page while being logged in
Given I am logged in
When I go to "/login"
Then I should be on "/"
Для @login я создал следующее:
/**
* @BeforeScenario @login
*/
public function loginUser()
{
$doctrine = $this->getContainer()->get('doctrine');
$userRepository = $doctrine->getRepository('MyTestBundle:User');
$user = $userRepository->find(1); // 1 = id
$token = new UsernamePasswordToken($user, NULL, 'main', $user->getRoles());
$this->getContainer()->get('security.context')->setToken($token);
}
В коде "когда я иду / вход в систему" (вызывается контроллер) токен, кажется, пропал (не то, что я намеревался):
/**
* @Route("/login", name="login")
*/
public function loginAction()
{
$token = $this->get('security.context')->getToken();
$fd = fopen('/tmp/debug.log', 'a');
fwrite($fd, $token);
// prints 'AnonymousToken(user="anon.", authenticated=true, roles="")'
...
Но в FeatureContext он, кажется, держится (как я надеялся, это сработает). В поле «Дано, я вошел в систему»:
/**
* @Given /^I am logged in$/
*/
public function iAmLoggedIn()
{
$token = $this->getContainer()->get('security.context')->getToken();
$fd = fopen('/tmp/debug.log', 'a');
fwrite($fd, $token);
// prints 'UsernamePasswordToken(user="admin", authenticated=true, roles="ROLE_ADMIN")'
...
Я бегу вот так:
app/console -e=test behat
Я также сделал это в контроллере, чтобы убедиться, что это тест:
fwrite($fd, $this->get('kernel')->getEnvironment());
// prints 'test'
Любая подсказка, как аутентифицировать пользователя? Мне нужно будет протестировать множество страниц администратора, поэтому было бы неплохо, если бы я мог подключить вход в @BeforeSuite, @BeforeFeature (или @BeforeScenario ...), чтобы меня не блокировали.
(Также приветствуются предложения по отключению механизма аутентификации для тестирования или способу заглушить / издеваться над пользователем.)