Я использую 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);
}
В коде "When я go to/login" (вызов контроллера вызывается) маркер кажется пропавшим (не то, что я намеревался):
/**
* @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...), чтобы я не блокировался.
(Предложения по отключению механизма проверки подлинности для тестирования или способ заглушить/издеваться над пользователем также приветствуются.)