test symfonytestslistener simple querybuilder not kerneltestcase exist does unit-testing authentication symfony phpunit fosuserbundle

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(); }