Ver índice de contenidos del libro

7.3. La clase WebTestCase

Symfony incluye una clase llamada WebTestCase que facilita mucho la creación de los tests funcionales. La versión de esta clase para Silex se llama Silex\WebTestCase y para utilizarla sólo debes hacer que la clase de tu test herede de ella:

use Silex\WebTestCase;
 
class ContactFormTest extends WebTestCase
{
    // ...
}

Advertencia Si quieres redefinir el comportamiento del método setUp() en la clase de tu test, no olvides invocar ese mismo método en la clase padre (parent::setUp()) para ejecutar la configuración por defecto de Silex.

Nota Para utilizar la clase WebTestCase de Symfony, primero tienes que instalar sus dependencias mediante Composer:

$ composer require --dev symfony/browser-kit symfony/css-selector

Las clases que heredan de WebTestCase deben implementar un método llamado createApplication que devuelve el objeto que representa a la aplicación. El siguiente código muestra un ejemplo de cómo hacerlo:

public function createApplication()
{
    // app.php debe devolver una instancia de la clase Application
    return require __DIR__.'/path/to/app.php';
}

Asegúrate de que no utilizas la instrucción require_once de PHP, ya que este método se ejecuta antes de cada test.

Truco Por defecto, dentro de un test la aplicación se comporta exactamente igual que si la estuviera accediendo un usuario a través de su navegador. No obstante, cuando se produce un error es más útil que el test acceda directamente a la excepción PHP en vez de la página HTML del error. Para ello, modifica ligeramente la configuración de la aplicación dentro del método createApplication() de la siguiente manera:

public function createApplication()
{
    $app = require __DIR__.'/path/to/app.php';
    $app['debug'] = true;
    unset($app['exception_handler']);
 
    return $app;
}

Truco Si tu aplicación utiliza sesiones, puedes establecer la opción session.test a true para simular las sesiones dentro del test:

public function createApplication()
{
    // ...
 
    $app['session.test'] = true;
 
    // ...
}

La clase WebTestCase dispone de un método llamado createClient() para crear el cliente utilizado en el test. Un cliente es como un navegador, ya que permite interactuar con la aplicación. El siguiente código muestra un ejemplo de su funcionamiento:

public function testInitialPage()
{
    $client = $this->createClient();
    $crawler = $client->request('GET', '/');
 
    $this->assertTrue($client->getResponse()->isOk());
    $this->assertCount(1, $crawler->filter('h1:contains("Contact us")'));
    $this->assertCount(1, $crawler->filter('form'));
    ...
}

El código anterior introduce varios conceptos importantes, tales como el cliente (clase Client) como el crawler (clase Crawler).

7.3.1. El cliente

El cliente de un test es equivalente al navegador de un usuario normal. El cliente almacena el historial de navegación, las cookies y mucha más información. Su método request() se utiliza para realizar peticiones a la aplicación.

Nota Consulta el capítulo Trabajando con el cliente de los tests del libro de Symfony para descubrir todas sus características.

7.3.2. El crawler

El crawler es un objeto que te permite inspeccionar el contenido de una página, tal y como haría un usuario con Firebug en Firefox o con el Inspector Web en Google Chrome o Safari. El contenido se inspecciona filtrándolo con expresiones CSS.