Как написать функциональный тест с аутентификацией пользователя? - PullRequest
4 голосов
/ 07 октября 2010

Я пишу функциональный тест для страницы, которая требует аутентификации пользователя.Я использую плагин sfDoctrineGuard.

Как аутентифицировать пользователя в моем тесте?

Нужно ли вводить каждый тест через экран входа?

Здесьмой неверный код:

$b->post('/sfGuardAuth/signin',
       array('signin[password]' => 'password',
             'signin[username]' => 'user',
             'signin[_csrf_token]' => '7bd809388ed8bf763fc5fccc255d042e'))->
       with('response')->begin()->
         checkElement('h2', 'Welcome Humans')->
       end()

Спасибо

Ответы [ 2 ]

6 голосов
/ 17 декабря 2011

Сложность при входе в систему заключается в том, что тестовый браузер стирает объект контекста перед каждым запросом (см. sfBrowser :: call () ).

Вы можете аутентифицировать пользователя, введя слушателя, который вызовет пользовательский метод signIn(), когда событие context.load_factories срабатывает во время инициализации контекста:

function signin( sfEvent $event )
{
  /* @var $user sfGuardSecurityUser */
  if( ! $user = $event->getSubject()->getUser() )
  {
    throw new RuntimeException('User object not created.');
  }

  if( ! $user instanceof sfGuardSecurityUser )
  {
    throw new LogicException(sprintf(
      'Cannot log in %s; sfGuardSecurityUser expected.',
        get_class($user)
    ));
  }

  if( $user->isAuthenticated() )
  {
    $user->signOut();
  }

  /* Magic happens here: */
  $user->signIn($desired_user_to_log_in_as);

  $event->getSubject()->getEventDispatcher()->notify(new sfEvent(
    $this,
    'application.log',
    array(sprintf('User is logged in as "%s".', $user->getUsername()))
  ));
}

/* Set signin() to fire when the browser inits the context for subsequent
 *  requests.
 */
$b->addListener('context.load_factories', 'signin');

Это приведет к тому, что браузер зарегистрирует пользователя для всех последующих запросов. Обратите внимание, что sfBrowser не не имеет метод removeListener().

Адаптировано из sfJwtPhpUnitPlugin (Ф.Д .: Я ведущий разработчик этого проекта).

3 голосов
/ 08 октября 2010

Да, вы должны войти, чтобы выполнить тесты. К счастью, это намного проще, чем метод, который вы иллюстрируете выше. Смотрите "лучше и проще" в этом блоге .

Вы можете сделать метод signin частью любого класса TestFunctional в соответствии с тем, как вы структурировали свои тесты.

...