🔬 Pruebas de Unidad y Pruebas de Característica a fondo
Garantizando la calidad y previniendo errores futuros
El **Testing** es la práctica de verificar que tu código se comporta como esperas. En Laravel, las pruebas se escriben con **PHPUnit** y son esenciales para el desarrollo profesional. Un buen conjunto de pruebas te permite refactorizar (reestructurar) código o añadir nuevas funcionalidades con la confianza de que no estás rompiendo partes existentes de la aplicación. Laravel distingue principalmente dos tipos de pruebas: **Unidad** y **Característica (Feature)**.
🧪 Configuración y Ejecución de Pruebas
Todas las pruebas residen en la carpeta **`tests/`**. Laravel utiliza el archivo de entorno `phpunit.xml` que, por defecto, carga las configuraciones de prueba desde un archivo `.env` específico, asegurando que tus pruebas no ensucien tu base de datos de desarrollo.
Para ejecutar todas las pruebas, usa Artisan:
Ejecución de todas las pruebas
        
      php artisan test
🧩 Pruebas de Unidad (Unit Testing)
Las **Pruebas de Unidad** se enfocan en probar una pequeña porción aislada de tu código, como una función o una clase, sin tocar el framework, la base de datos o el sistema de archivos. El objetivo es asegurar que la **lógica de negocio** funciona correctamente de forma atómica.
Ejemplo: Probar una clase de utilidad
Queremos probar un método que calcula el descuento, asegurando que no requiere inicializar Laravel.
Prueba de Unidad (tests/Unit/CalculadoraTest.php)
        
      namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
use App\Utilities\Calculadora;
class CalculadoraTest extends TestCase
{
    /** @test */
    public function el_calculo_de_descuento_es_correcto()
    {
        $monto = 100;
        $descuento = 0.10; // 10%
        
        $resultado = Calculadora::aplicarDescuento($monto, $descuento);
        
        // Assertions: Verificamos que el resultado es el esperado
        $this->assertEquals(90, $resultado);
    }
}
    🌐 Pruebas de Característica (Feature Testing)
Las **Pruebas de Característica** prueban porciones más grandes de tu aplicación, incluyendo la forma en que interactúan las rutas, los controladores, las bases de datos y las vistas. Simulan peticiones HTTP reales a la aplicación (GET, POST, etc.). Son cruciales para probar el flujo completo de una *característica* del usuario (ej. registro, envío de formulario, carga de página).
Ejemplo: Crear un Post (CRUD)
Usaremos **Factories y la base de datos en memoria (SQLite)** para simular el entorno real sin afectar los datos de desarrollo (mira la entrada de Factories y Seeders).
Prueba de Característica (tests/Feature/PostTest.php)
        
      namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
use App\Models\User;
use App\Models\Post;
class PostTest extends TestCase
{
    use RefreshDatabase; // Resetea la BD por cada prueba
    /** @test */
    public function un_usuario_autenticado_puede_crear_un_post()
    {
        // 1. Preparación: Crear un usuario usando Factory
        $user = User::factory()->create();
        // 2. Acción: Actuamos como el usuario y enviamos un POST
        $response = $this->actingAs($user)->post('/posts', [
            'titulo' => 'Mi Nuevo Post de Prueba',
            'contenido' => 'Contenido de mi nuevo post.',
        ]);
        // 3. Verificación (Assertions)
        $response->assertStatus(302); // Esperamos una redirección
        $response->assertRedirect('/posts'); // A la lista de posts
        // Verificamos que el registro existe en la base de datos
        $this->assertDatabaseHas('posts', [
            'titulo' => 'Mi Nuevo Post de Prueba',
            'user_id' => $user->id,
        ]);
    }
}
    🎯 La Clave del Testing: Los Assertions
La parte más importante de cualquier prueba son los **Assertions** (aserciones). Son los métodos que verifican que el comportamiento del código es el esperado.
- **
$this->assertEquals(esperado, real)**: Verifica que dos valores son iguales. (Unidad) - **
$response->assertStatus(código)**: Verifica el código HTTP de la respuesta (ej. 200, 302, 403). (Característica) - **
$response->assertSee('Texto')**: Verifica que un texto aparece en el HTML de la respuesta. (Característica) - **
$this->assertDatabaseHas('tabla', ['campo' => 'valor'])**: Verifica que existe un registro en la base de datos con ciertos datos. (Característica) 
  
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias