PHPSPEC: LA HERRAMIENTA DE BDD PARA DESARROLLADORES PHP

PHPSpec es un framework de especificación (spec) para PHP que promueve el BDD, Behavior Driven Development y se integra con el Spec Driven Development.
Fue creado por Marcello Duarte y el equipo de SensioLabs, y se mantiene activo en la comunidad.
A diferencia de PHPUnit, que es más orientado a pruebas unitarias tradicionales, PHPSpec está pensado para describir el comportamiento esperado de las clases y objetos de forma natural y legible, casi como si se estuviera escribiendo documentación ejecutable. PHPSpec ayuda a escribir código más limpio, con mejor diseño y más mantenible.

Ventajas de Usar PHPSpec

  • Legibilidad extrema: Los tests (llamados specs) se leen como prosa inglesa.
  • Diseño guiado por comportamiento: Te obliga a pensar primero en la interfaz pública de tus clases.
  • Generación de código: Puede generar automáticamente el código esqueleto de tus clases a partir de las especificaciones.
  • Mocks integrados y potentes: Usar Prophet, un excelente mocking library.
  • Enfoque en OOP: Ideal para código bien diseñado y orientado a objetos.
  • Integración: Funciona perfectamente junto a PHPUnit (muchos proyectos usan ambos).
Prophet es el framework de mocking que utiliza PHPSpec por defecto.

Instalación

La forma más sencilla es mediante Composer:

composer require --dev phpspec/phpspec
Configuración básica ("phpspec.yml"):

suites:
    main:
   namespace: App
   psr4_prefix: App
   src_path: src

Escribiendo la Primera Spec

Se que queremos modelar un carrito de compras:

vendor/bin/phpspec describe "App\\CarritoDeCompras"
Esto genera automáticamente el archivo:

// spec/App/CarritoDeComprasSpec.php
namespace spec\App;

use App\CarritoDeCompras;
use PhpSpec\ObjectBehavior;

class CarritoDeComprasSpec extends ObjectBehavior
{
    function it_is_initializable()
    {
   $this->shouldHaveType(CarritoDeCompras::class);
    }
}
Ahora se implementa el comportamiento:

// spec/App/CarritoDeComprasSpec.php
function it_permite_agregar_productos()
{
    $producto = new Producto('Laptop', 1200);
    
    $this->agregar($producto, 1);
    $this->contarItems()->shouldReturn(1);
    $this->calcularTotal()->shouldReturn(1200);
}

function it_calcula_total_con_multiple_cantidad()
{
    $producto = new Producto('Mouse', 25);
    
    $this->agregar($producto, 3);
    $this->calcularTotal()->shouldReturn(75);
}

Comandos Más Útiles

Buenas Prácticas con PHPSpec

  1. Nombrar las specs como preguntas:"it_should_calculate_total_with_discount()"
  2. Mantener las specs enfocadas: Una spec por comportamiento.
  3. Usar "let()" y "letGo()" para configurar contexto:

    function let()
    {
        $this->beConstructedWith(new CalculadoraImpuestos());
    }
    
  4. Evita probar implementación interna (métodos privados). PHPSpec te empuja a probar solo la interfaz pública.