Symfony 2.0, el libro oficial

10.2. Tests unitarios

Un test unitario normalmente prueba una clase PHP específica. Si deseas probar el comportamiento de tu aplicación entera, consulta la sección tests funcionales más adelante en este mismo capítulo.

Escribir tests unitarios para Symfony2 es muy similar a escribir los tests unitarios normales de PHPUnit. Supongamos por ejemplo que tienes la siguiente clase simple llamada Calculator en el directorio Utility/ de tu bundle:

// src/Acme/DemoBundle/Utility/Calculator.php
namespace Acme\DemoBundle\Utility;

class Calculator
{
    public function add($a, $b)
    {
        return $a + $b;
    }
}

Para crear un test que pruebe esta clase, crea un archivo llamado CalculatorTest en el directorio Tests/Utility del bundle:

// src/Acme/DemoBundle/Tests/Utility/CalculatorTest.php
namespace Acme\DemoBundle\Tests\Utility;

use Acme\DemoBundle\Utility\Calculator;

class CalculatorTest extends \PHPUnit_Framework_TestCase
{
    public function testAdd()
    {
        $calc = new Calculator();
        $result = $calc->add(30, 12);

        // ¡acierta que nuestra calculadora suma dos números correctamente!
        $this->assertEquals(42, $result);
    }
}

Nota Por convención, la estructura del subdirectorio Tests/ debería replicar la estructura de directorios en la que se encuentra la clase que se está probando. Por lo tanto, si estás probando una clase en el directorio Utility/ de tu bundle, pon tus tests en el directorio Tests/Utility.

Al igual que sucede en la aplicación, la carga automática de clases funciona gracias al archivo bootstrap.php.cache (tal y como está configurado por defecto en el archivo phpunit.xml.dist).

Ejecutar los tests de un determinado archivo o directorio es muy fácil:

# ejecuta todos los tests del directorio 'Utility'
$ phpunit -c app src/Acme/DemoBundle/Tests/Utility/

# ejecuta los tests de la clase Calculator
$ phpunit -c app src/Acme/DemoBundle/Tests/Utility/CalculatorTest.php

# ejecuta todos los tests del bundle indicado
$ phpunit -c app src/Acme/DemoBundle/