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

Testing 如何使用用户身份验证编写功能测试?,testing,symfony1,doctrine,symfony-1.4,functional-testing,Testing,Symfony1,Doctrine,Symfony 1.4,Functional Testing,我正在为需要用户身份验证的页面编写功能测试。我正在使用sfDoctrineGuard插件 如何在测试中对用户进行身份验证 我必须通过登录屏幕输入每个测试吗 这是我的错误代码: $b->post('/sfGuardAuth/signin', array('signin[password]' => 'password', 'signin[username]' => 'user', 'signin[_csrf_toke

我正在为需要用户身份验证的页面编写功能测试。我正在使用sfDoctrineGuard插件

如何在测试中对用户进行身份验证

我必须通过登录屏幕输入每个测试吗

这是我的错误代码:

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

谢谢

是的,您必须登录才能执行测试。幸运的是,这比上面演示的方法简单得多。请参阅“更好、更简单的方法”


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

进行signin的棘手部分是,测试浏览器会在每次请求之前清除上下文对象(请参阅)

您可以通过注入侦听器对用户进行身份验证,该侦听器将在上下文初始化期间触发
context.load\u factories
事件时调用用户的
signIn()
方法:

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()
方法


改编自(FD:我是这个项目的首席开发人员)。

这个页面现在已经不存在了,但是这里有另一种方法来做[日志测试]()太棒了!只想说,当在sfTestFunctional的某个子类中定义signin方法时,必须像这样调用侦听器附件$b->addListener('context.load_factories',array($b,'signin');我需要在symfony引导过程中强制登录,因为我的应用程序的myUser取决于路径。所以我用$b->addListener('controller.change\u action','sign')来代替。