#Introducción
Laravel ofrece una variedad de herramientas y aserciones útiles para facilitar las pruebas de sus aplicaciones basadas en bases de datos. Además, las factories de modelos y los seeders de Laravel hacen que sea sencillo crear registros de prueba en la base de datos utilizando los modelos Eloquent y sus relaciones de su aplicación. Discutiremos todas estas potentes características en la siguiente documentación.
#Restablecer la base de datos después de cada prueba
Antes de continuar, hablemos de cómo restablecer su base de datos después de cada prueba para que los datos de una prueba anterior no interfieran con las pruebas siguientes. El trait Illuminate\Foundation\Testing\RefreshDatabase incluido en Laravel se encargará de esto por usted. Simplemente use el trait en su clase de prueba:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* Un ejemplo básico de prueba funcional.
*/
public function test_basic_example(): void
{
$response = $this->get('/');
// ...
}
}
El trait Illuminate\Foundation\Testing\RefreshDatabase no migra su base de datos si su esquema está actualizado. En su lugar, solo ejecutará la prueba dentro de una transacción de base de datos. Por lo tanto, cualquier registro agregado a la base de datos por casos de prueba que no usen este trait puede seguir existiendo en la base de datos.
Si desea restablecer completamente la base de datos, puede usar los traits Illuminate\Foundation\Testing\DatabaseMigrations o Illuminate\Foundation\Testing\DatabaseTruncation. Sin embargo, ambas opciones son significativamente más lentas que el trait RefreshDatabase.
#Factories de Modelos
Al realizar pruebas, puede que necesite insertar algunos registros en su base de datos antes de ejecutar la prueba. En lugar de especificar manualmente el valor de cada columna al crear estos datos de prueba, Laravel le permite definir un conjunto de atributos predeterminados para cada uno de sus modelos Eloquent usando factories de modelos.
Para aprender más sobre cómo crear y utilizar factories de modelos para crear modelos, consulte la documentación completa de factories de modelos. Una vez que haya definido una factory, puede usarla dentro de su prueba para crear modelos:
use App\Models\User;
public function test_models_can_be_instantiated(): void
{
$user = User::factory()->create();
// ...
}
#Ejecutar Seeders
Si desea usar seeders de base de datos para poblar su base de datos durante una prueba funcional, puede invocar el método seed. Por defecto, el método seed ejecutará el DatabaseSeeder, que debería ejecutar todos sus otros seeders. Alternativamente, puede pasar el nombre de una clase seeder específica al método seed:
<?php
namespace Tests\Feature;
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* Probar la creación de una nueva orden.
*/
public function test_orders_can_be_created(): void
{
// Ejecutar el DatabaseSeeder...
$this->seed();
// Ejecutar un seeder específico...
$this->seed(OrderStatusSeeder::class);
// ...
// Ejecutar un array de seeders específicos...
$this->seed([
OrderStatusSeeder::class,
TransactionStatusSeeder::class,
// ...
]);
}
}
Alternativamente, puede indicar a Laravel que ejecute automáticamente el seeder antes de cada prueba que use el trait RefreshDatabase. Puede lograr esto definiendo una propiedad $seed en su clase base de prueba:
<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
use CreatesApplication;
/**
* Indica si el seeder por defecto debe ejecutarse antes de cada prueba.
*
* @var bool
*/
protected $seed = true;
}
Cuando la propiedad $seed es true, la prueba ejecutará la clase Database\Seeders\DatabaseSeeder antes de cada prueba que use el trait RefreshDatabase. Sin embargo, puede especificar un seeder específico que se debe ejecutar definiendo una propiedad $seeder en su clase de prueba:
use Database\Seeders\OrderStatusSeeder;
/**
* Ejecutar un seeder específico antes de cada prueba.
*
* @var string
*/
protected $seeder = OrderStatusSeeder::class;
#Aserciones disponibles
Laravel proporciona varias aserciones de base de datos para sus pruebas funcionales con PHPUnit. Discutiremos cada una de estas aserciones a continuación.
#assertDatabaseCount
Asegura que una tabla en la base de datos contenga el número dado de registros:
$this->assertDatabaseCount('users', 5);
#assertDatabaseHas
Asegura que una tabla en la base de datos contenga registros que coincidan con las restricciones de consulta clave/valor dadas:
$this->assertDatabaseHas('users', [
'email' => 'sally@example.com',
]);
#assertDatabaseMissing
Asegura que una tabla en la base de datos no contenga registros que coincidan con las restricciones de consulta clave/valor dadas:
$this->assertDatabaseMissing('users', [
'email' => 'sally@example.com',
]);
#assertSoftDeleted
El método assertSoftDeleted puede usarse para asegurar que un modelo Eloquent dado ha sido "soft deleted":
$this->assertSoftDeleted($user);
#assertNotSoftDeleted
El método assertNotSoftDeleted puede usarse para asegurar que un modelo Eloquent dado no ha sido "soft deleted":
$this->assertNotSoftDeleted($user);
#assertModelExists
Asegura que un modelo dado existe en la base de datos:
use App\Models\User;
$user = User::factory()->create();
$this->assertModelExists($user);
#assertModelMissing
Asegura que un modelo dado no existe en la base de datos:
use App\Models\User;
$user = User::factory()->create();
$user->delete();
$this->assertModelMissing($user);
#expectsDatabaseQueryCount
El método expectsDatabaseQueryCount puede invocarse al inicio de su prueba para especificar el número total de consultas a la base de datos que espera que se ejecuten durante la prueba. Si el número real de consultas ejecutadas no coincide exactamente con esta expectativa, la prueba fallará:
$this->expectsDatabaseQueryCount(5);
// Prueba...