¿QUÉ ES FAKING EN LARAVEL?

Faking es una funcionalidad de Laravel que permite simular el comportamiento de ciertos servicios durante las pruebas, sin que realmente se ejecuten. Siendo muy útil para:
  • Evitar que se envíen emails reales
  • Evitar que se disparen notificaciones reales
  • Evitar que se procesen jobs en la cola
  • Evitar subir archivos reales
  • etc..

Principales usos de Faking en tests

Servicio Cómo hacer Fake Uso común
Mail Mail::fake(); Probar que se envía un email
Notification Notification::fake(); Probar notificaciones
Event Event::fake(); Probar eventos
Queue Queue::fake(); Probar jobs en cola
Storage Storage::fake('public'); Probar subida de archivos
Bus Bus::fake(); Probar commands/jobs
Http Http::fake(); Probar llamadas HTTP externas
Facades Facade::fake(); o SpecificFacade::fake() Cualquier facade

Ejemplo práctico

// tests/Feature/RegistrationTest.php
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Notification;

public function test_user_registration()
{
    Mail::fake();
    Notification::fake();

    $response = $this->post('/register', [
        'name' => 'Juan',
        'email' => 'juan@example.com',
        // ...
    ]);

    $response->assertRedirect();

    // Verificar que se "envió" un email
    Mail::assertSent(WelcomeMail::class, function ($mail) {
        return $mail->hasTo('juan@example.com');
    });

    // Verificar que se envió una notificación
    Notification::assertSentTo($user, NewUserNotification::class);
}

Ventajas del Faking

  • No se contaminan sistemas externos como email, APIs, base de datos de producción, etc.
  • Los tests son mucho más rápidos
  • Se pueden hacer hacer assertions muy específicos sobre qué se envió/procesó
  • Código más limpio y mantenible
Un "assertion" es una verificación que se hace en las pruebas para comprobar que el resultado obtenido es el que se esperaba.