RefreshDatabase
Трейт RefreshDatabase используется в тестовых классах Laravel для управления состоянием базы данных. Он автоматически запускает миграции и сбрасывает базу данных перед каждым тестом, гарантируя, что каждый тест начинается с чистой базы данных. Трейт подключается к классу теста с помощью директивы use.
Синтаксис
Для использования трейта необходимо подключить его в классе теста, который наследуется от TestCase:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class UserTest extends TestCase
{
use RefreshDatabase;
}
?>
Пример
Давайте напишем тест, который проверяет создание пользователя. Трейт RefreshDatabase автоматически очистит базу данных перед выполнением теста:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\User;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_user_creation()
{
$res = User::create([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password')
]);
$this->assertDatabaseHas('users', [
'email' => 'john@example.com'
]);
echo 'User created successfully';
}
}
?>
Результат выполнения кода:
"User created successfully"
Пример
Трейт RefreshDatabase также работает с тестами, использующими фабрики. Каждый тест будет начинаться с пустой базы данных:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\User;
class UserTest extends TestCase
{
use RefreshDatabase;
public function test_database_is_empty_before_each_test()
{
$count_before = User::count();
echo 'Count before: ' . $count_before;
User::factory()->count(5)->create();
$count_after = User::count();
echo 'Count after: ' . $count_after;
}
}
?>
Результат выполнения кода:
"Count before: 0"
"Count after: 5"
Пример
При использовании транзакций трейт RefreshDatabase может работать в режиме транзакций для ускорения тестов. По умолчанию используется миграция, но можно настроить использование транзакций:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Models\User;
class UserTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
// Не использовать транзакции, только миграции
$this->refreshDatabase();
}
public function test_using_migrations()
{
$res = User::create([
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'password' => bcrypt('password')
]);
$this->assertDatabaseHas('users', [
'email' => 'jane@example.com'
]);
}
}
?>