Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Testear un formulario con redireccion con PHPunit y Symfony

14 de junio de 2015

Hola:

Voy a empezar a realizar los test de mi aplicación y ando muy perdido. He leído sobre los test, pero me cuesta mucho hacer que me funcionen, supongo que será falta de experiencia.

Os expongo un test de ejemplo:

Quiero poder acceder al backend de mi aplicación, que esta protegido con un usuario y contraseña. Si hago un test, que acceda directamente, falla (como me lo esperaba, porque hace falta estar logueado). Si el test intenta acceder a la pagina de login, me accede correctamente. El problema está con el formulario.

Este es el test que estoy intentado hacer:

public function testLogin()
    {
        $client = static::createClient();
        $crawler = $client->request('GET', '/login');
 
        $form = $crawler->selectButton('submit')->form();
 
        $form['username'] = 'root';
        $form['password'] = 'root';
 
        $crawler = $client->submit($form);
        $client->followRedirects();
 
        $this->assertGreaterThan(
            0,
            $crawler->filter('html:contains("Destiny Dashboard")')->count()
        );
    }

Y aquí me he quedado bloqueado. ¿El formulario está correctamente enviado?¿Si lo está, por qué me falla el test?

Gracias de antemano


Respuestas

#1

Lo primero que te diría es que el código que muestras puede estar bien para probar que el formulario de login funciona, pero que no debes utilizarlo en otros tests. Si quieres probar cosas que están protegidas por un firewall, la única manera simple y correcta de hacerlo es usar este truco. Como ves, tienes que cambiar el tipo de firewall solo para los tests (por eso solo cambias el archivo config_test.yml) y después tienes que poner el usuario y contraseña al crear el cliente (esto es lo recomendado) o al hacer la petición.

Por otra parte, con la información que nos das no es posible saber la causa del error. En estos casos, el error puede ser por ejemplo porque la página recibida al final no es la que esperas y por eso su contenido no cumple con el filter() que has definido.

Lo que yo hago en esos casos es mostrar por pantalla la respuesta completa recibida. Después de $client->followRedirects(); pon lo siguiente:

// ...
$client->followRedirects();
 
dump($client->getResponse());
// ...

Si la respuesta es muy grande, mejor guardar el resultado en un archivo para estudiarlo tranquilamente:

$ phpunit -c app > borrame.txt

@javiereguiluz

15 junio 2015, 9:35