如何使用用户身份验证编写功能测试?

时间:2010-10-07 19:11:38

标签: testing symfony1 doctrine symfony-1.4 functional-testing

我正在为需要用户身份验证的页面编写功能测试。我正在使用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 个答案:

答案 0 :(得分:6)

关于进行登录的棘手部分是测试浏览器在每次请求之前清除上下文对象(参见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 的方法<{1}}。

改编自sfJwtPhpUnitPlugin(FD:我是这个项目的主要开发者)。

答案 1 :(得分:3)

是的,您必须登录才能进行测试。幸运的是,这比上面说明的方法简单得多。请参阅“更好更简单的方法”on this blog post

根据您的测试结构,您可以将signin方法作为任何TestFunctional类的一部分。