unit testing - symfonytestslistener - Symfony2-Pruebas con FOSUserBundle
symfony test querybuilder (2)
Escribiría una prueba para Symfony2 con FOSUserBundle.
Por el momento intenté algunas maneras y nadie trabaja.
Necesito una función como "createAuthClient".
Aquí está mi clase básica. Lo publico porque puedes entender mejor mi problema.
<?php
use Symfony/Bundle/FrameworkBundle/Test/WebTestCase;
use Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken;
use Symfony/Component/BrowserKit/Cookie;
class WebTestMain extends WebTestCase
{
protected static $container;
static protected function createClient(array $options = array(), array $server = array())
{
$client = parent::createClient($options, $server);
self::$container = self::$kernel->getContainer();
return $client;
}
static function createAuthClient(array $options = array(), array $server = array())
{
// see lines below with my tries
}
}
Primer intento:
if(static::$kernel === null)
{
static::$kernel = static::createKernel($options);
static::$kernel->boot();
}
if(static::$container === null)
{
self::$container = self::$kernel->getContainer();
}
$parameters = self::$container->getParameter(''test'');
$server = array_merge(array(''HTTP_HOST'' => $parameters[''host''], ''HTTP_USER_AGENT'' => $parameters[''useragent'']), $server);
$client = self::createClient($options, $server);
$userProvider = self::$container->get(''fos_user.user_manager'');
$user = $userProvider->findUserBy(array(''id'' => 1));
$client->getCookieJar()->set(new Cookie(''MOCKSESSID'', true));
$session = self::$kernel->getContainer()->get(''session'');
$token = new UsernamePasswordToken($user, null, ''main'', $user->getRoles());
$client->getContainer()->get(''security.context'')->setToken($token);
$session->set(''_security_main'', serialize($token));
return $client;
Luego busqué y busqué ... Mi segundo intento.
if(static::$kernel === null)
{
static::$kernel = static::createKernel($options);
static::$kernel->boot();
}
if(static::$container === null)
{
self::$container = self::$kernel->getContainer();
}
$parameters = self::$container->getParameter(''test'');
$server = array_merge(
array(
''HTTP_HOST'' => $parameters[''host''],
''HTTP_USER_AGENT'' => $parameters[''useragent''],
''PHP_AUTH_USER'' => ''admin'',
''PHP_AUTH_PW'' => ''admin''
),
$server
);
$client = static::createClient(array(), array());
$client->followRedirects();
return $client;
Y aquí está mi último intento antes de publicar esta pregunta ...
$client = self::createClient($options, $server);
$parameters = self::$container->getParameter(''test'');
$server = array_merge(
array(
''HTTP_HOST'' => $parameters[''host''],
''HTTP_USER_AGENT'' => $parameters[''useragent'']
),
$server
);
$client->setServerParameters($server);
$usermanager = self::$container->get(''fos_user.user_manager'');
$testuser = $usermanager->createUser();
$testuser->setUsername(''test'');
$testuser->setEmail(''[email protected]'');
$testuser->setPlainPassword(''test'');
$usermanager->updateUser($testuser);
return $client;
Gracias de antemano.
Cree un AbstractControllerTest
y cree un cliente autorizado en setUp()
siguiente manera:
<?php
// ...
use Symfony/Component/BrowserKit/Cookie;
abstract class AbstractControllerTest extends WebTestCase
{
/**
* @var Client
*/
protected $client = null;
public function setUp()
{
$this->client = $this->createAuthorizedClient();
}
/**
* @return Client
*/
protected function createAuthorizedClient()
{
$client = static::createClient();
$container = $client->getContainer();
$session = $container->get(''session'');
/** @var $userManager /FOS/UserBundle/Doctrine/UserManager */
$userManager = $container->get(''fos_user.user_manager'');
/** @var $loginManager /FOS/UserBundle/Security/LoginManager */
$loginManager = $container->get(''fos_user.security.login_manager'');
$firewallName = $container->getParameter(''fos_user.firewall_name'');
$user = $userManager->findUserBy(array(''username'' => ''REPLACE_WITH_YOUR_TEST_USERNAME''));
$loginManager->loginUser($firewallName, $user);
// save the login token into the session and put it in a cookie
$container->get(''session'')->set(''_security_'' . $firewallName,
serialize($container->get(''security.context'')->getToken()));
$container->get(''session'')->save();
$client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));
return $client;
}
}
NOTA: Por favor, reemplace el nombre de usuario con su nombre de usuario de prueba.
Luego, amplía AbstractControllerTest
y utiliza el $client
global para realizar solicitudes de la siguiente manera:
class ControllerTest extends AbstractControllerTest
{
public function testIndexAction()
{
$crawler = $this->client->request(''GET'', ''/admin/'');
$this->assertEquals(
Response::HTTP_OK,
$this->client->getResponse()->getStatusCode()
);
}
}
Este método probado y funciona bien
La mejor manera que he encontrado para probar con un usuario autenticado es simplemente visitar su página de inicio de sesión y enviar el formulario con el nombre de usuario y la contraseña que ha cargado desde un dispositivo. Esto puede parecer lento y engorroso, pero pondrá a prueba lo que el usuario realmente hará. Incluso puedes crear tu propio método para hacer que usarlo sea rápido y fácil.
public function doLogin($username, $password) {
$crawler = $this->client->request(''GET'', ''/login'');
$form = $crawler->selectButton(''_submit'')->form(array(
''_username'' => $username,
''_password'' => $password,
));
$this->client->submit($form);
$this->assertTrue($this->client->getResponse()->isRedirect());
$crawler = $this->client->followRedirect();
}