Testing 如何使用用户身份验证编写功能测试?
我正在为需要用户身份验证的页面编写功能测试。我正在使用sfDoctrineGuard插件 如何在测试中对用户进行身份验证 我必须通过登录屏幕输入每个测试吗 这是我的错误代码: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
$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')来代替。