Symfony2在功能测试中登录FOS UserBundle

Vit*_*lyP 9 phpunit unit-testing symfony fosuserbundle

如何登录内部测试以便能够执行特定于用户的操作?

Uto*_*pik 5

实际上,身份验证必须像真实用户那样进行.在这种情况下,您必须知道普通密码并填写登录表单

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class XXX extends WebTestCase {
  public function testUserLogin() {

   $client = static::createClient();
   $crawler = $client->request('GET', '/login');

   $form = $crawler->selectButton('_submit')->form(array(
     '_username'  => 'user',
     '_password'  => 'pa$$word',
   ));

   $client->submit($form);
   $crawler = $client->followRedirect(); // "/" page

   // if credentials were correct, you should be logged in and ready to test your app
  }
}
Run Code Online (Sandbox Code Playgroud)


Vit*_*ian 0

这就是我为一个项目实现它的方式(不是使用 FOSUserBundle,但可能你会发现它很有帮助)

private function createAuthorizedClient($role)
{
    $userProvider = new YourUserProvider(...);
    $user = $userProvider->createUserMethod(...);

    $client = $this->createClient(); //Normal WebTestCase client
    $client->getCookieJar()->set(new Cookie(session_name(), true));
    $session = self::$kernel->getContainer()->get('session');
    $token =  new UsernamePasswordToken($user, 'password', 'main', array($role));
    $client->getContainer()->get('security.context')->setToken($token);
    $session->set('_security_main', serialize($token));

    return $client;
}
Run Code Online (Sandbox Code Playgroud)

不要忘记模拟用户对象的预期结果。